diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 476711da..1145fdcc 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -27,9 +27,9 @@ jobs: npm ci PR_NUMBER=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }') REPO_NAME=camp-js-2024-ekaterina-tebyakina - npm run angular:build -- --baseHref=/$REPO_NAME/pr-preview/pr-$PR_NUMBER/ + npm run react:build -- --base=/$REPO_NAME/pr-preview/pr-$PR_NUMBER/ - name: Deploy preview uses: rossjrw/pr-preview-action@v1 with: - source-dir: dist/apps/angular + source-dir: dist/apps/react diff --git a/apps/react/index.html b/apps/react/index.html index 1f4b2e25..292cd6bd 100644 --- a/apps/react/index.html +++ b/apps/react/index.html @@ -7,7 +7,7 @@ - React App + Anime App diff --git a/apps/react/src/App.tsx b/apps/react/src/App.tsx index a3a6dcc4..6f4bb000 100644 --- a/apps/react/src/App.tsx +++ b/apps/react/src/App.tsx @@ -2,20 +2,25 @@ import { FC, Suspense } from 'react'; import { Provider } from 'react-redux'; import { BrowserRouter } from 'react-router-dom'; +import { StyledEngineProvider } from '@mui/material'; import { RootRouter } from './routes/RootRouter'; -import { store } from './store'; +import { Header } from './components/header/Header'; +import { store } from './store/store'; +import './theme/styles.css'; -/** - * App component. - */ +/** App component. */ export const App: FC = () => (
- Brrr... here should be your loader component
}> - - + + Brrr... here should be your loader component}> +
+ + + + diff --git a/apps/react/src/api/index.ts b/apps/react/src/api/index.ts index e087cc6d..0d117be4 100644 --- a/apps/react/src/api/index.ts +++ b/apps/react/src/api/index.ts @@ -3,7 +3,7 @@ import axios from 'axios'; import { CONFIG } from './config'; /** - * Http const with baseUrl. + * Http const with base url. */ export const http = axios.create({ baseURL: CONFIG.apiUrl, diff --git a/apps/react/src/components/header/Header.module.css b/apps/react/src/components/header/Header.module.css new file mode 100644 index 00000000..2ea5c71c --- /dev/null +++ b/apps/react/src/components/header/Header.module.css @@ -0,0 +1,22 @@ +.header { + width: 100%; + height: var(--header-height); + padding: 0 var(--space-m); + background-color: var(--primary-background-color); + color: var(--primary-font-color); + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} + +.title { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-semibold); +} + +.nav { + display: flex; + flex-direction: row; + gap: var(--space-m); +} diff --git a/apps/react/src/components/header/Header.tsx b/apps/react/src/components/header/Header.tsx new file mode 100644 index 00000000..e8422953 --- /dev/null +++ b/apps/react/src/components/header/Header.tsx @@ -0,0 +1,56 @@ +import { FC, memo } from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import AppBar from '@mui/material/AppBar'; +import Chip from '@mui/material/Chip'; +import Stack from '@mui/material/Stack'; +import { ANIME_PATH } from '@js-camp/react/features/anime/routes'; +import { GENRES_PATH } from '@js-camp/react/features/genres/routes'; +import { STUDIOS_PATH } from '@js-camp/react/features/studios/routes'; + +import styles from './Header.module.css'; + +/** Header component. */ +const HeaderComponent: FC = () => { + + const location = useLocation(); + + const isCurrentPath = (path: string) => location.pathname.startsWith(path); + + return ( + + + Authorization menu + + ); +}; + +/** Memoized header. */ +export const Header = memo(HeaderComponent); diff --git a/apps/react/src/features/anime/pages/AnimePage.tsx b/apps/react/src/features/anime/pages/AnimePage.tsx new file mode 100644 index 00000000..8f8b7d8c --- /dev/null +++ b/apps/react/src/features/anime/pages/AnimePage.tsx @@ -0,0 +1,11 @@ +import { memo, FC } from 'react'; + +/** Anime page component. */ +const AnimePageComponent: FC = () => ( + <> +

Anime

+ +); + +/** Memoized anime page component. */ +export const AnimePage = memo(AnimePageComponent); diff --git a/apps/react/src/features/anime/routes.tsx b/apps/react/src/features/anime/routes.tsx new file mode 100644 index 00000000..1bc94868 --- /dev/null +++ b/apps/react/src/features/anime/routes.tsx @@ -0,0 +1,15 @@ +import { lazy } from 'react'; +import { RouteObject } from 'react-router-dom'; + +const AnimePage = lazy(() => import('./pages/AnimePage').then(module => ({ default: module.AnimePage }))); + +/** Path to anime for url. */ +export const ANIME_PATH = 'anime'; + +/** Route object for anime page. */ +export const animeRoutes: readonly RouteObject[] = [ + { + path: ANIME_PATH, + element: , + }, +]; diff --git a/apps/react/src/features/genres/components/GenreCard/GenreCard.module.css b/apps/react/src/features/genres/components/GenreCard/GenreCard.module.css index ba920896..13e1ed5b 100644 --- a/apps/react/src/features/genres/components/GenreCard/GenreCard.module.css +++ b/apps/react/src/features/genres/components/GenreCard/GenreCard.module.css @@ -1,3 +1,14 @@ .card { - background-color: aliceblue; + padding: var(--space-m); + height: 100%; +} + +.title { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + padding: var(--space-s) 0; +} + +.information { + padding: var(--space-s) 0; } diff --git a/apps/react/src/features/genres/components/GenreCard/GenreCard.tsx b/apps/react/src/features/genres/components/GenreCard/GenreCard.tsx index 93dc63ee..92d79eb3 100644 --- a/apps/react/src/features/genres/components/GenreCard/GenreCard.tsx +++ b/apps/react/src/features/genres/components/GenreCard/GenreCard.tsx @@ -1,23 +1,42 @@ import { memo, FC } from 'react'; -import { Genre } from '@js-camp/core/models/genre'; +import { useParams, Link } from 'react-router-dom'; +import { Button, Paper, Typography } from '@mui/material'; + +import { EDIT_GENRE_PATH, GENRES_PATH } from '../../routes'; import styles from './GenreCard.module.css'; -type Props = { +/** Card with genre data. */ +const GenreCardComponent: FC = () => { + + const { id } = useParams<{ id: string; }>(); + + const linkToEdit = `/${GENRES_PATH}/${id}/${EDIT_GENRE_PATH}`; + + return ( + +

+ Item Name +

+
+ + Information about item with id = {id} + + +
+
+ ); - /** Genre. */ - readonly genre: Genre; }; -/** Card with genre data. */ -const GenreCardComponent: FC = ({ genre }: Props) => ( -
-

{genre.name}

- Id - {genre.id} -
-); - -/** - * Memorized genre card. - */ +/** Memoized genre card. */ export const GenreCard = memo(GenreCardComponent); diff --git a/apps/react/src/features/genres/components/GenreCard/index.ts b/apps/react/src/features/genres/components/GenreCard/index.ts deleted file mode 100644 index ce3e0885..00000000 --- a/apps/react/src/features/genres/components/GenreCard/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { GenreCard } from './GenreCard'; diff --git a/apps/react/src/features/genres/components/GenreEditForm/GenreEditForm.tsx b/apps/react/src/features/genres/components/GenreEditForm/GenreEditForm.tsx new file mode 100644 index 00000000..6adb6a96 --- /dev/null +++ b/apps/react/src/features/genres/components/GenreEditForm/GenreEditForm.tsx @@ -0,0 +1,11 @@ +import { FC, memo } from 'react'; + +/** Genre edit form. */ +const GenreEditFormComponent: FC = () => ( +
+ Edit form +
+); + +/** Memoized genre edit form. */ +export const GenreEditForm = memo(GenreEditFormComponent); diff --git a/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.module.css b/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.module.css new file mode 100644 index 00000000..f063c260 --- /dev/null +++ b/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.module.css @@ -0,0 +1,12 @@ +.form { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--space-xs); + padding: var(--space-s); +} + +.field { + height: var(--form-field-height); + flex-grow: 1; +} diff --git a/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.tsx b/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.tsx new file mode 100644 index 00000000..bf40581a --- /dev/null +++ b/apps/react/src/features/genres/components/GenresFilterForm/GenresFilterForm.tsx @@ -0,0 +1,18 @@ +import { memo, FC } from 'react'; +import { TextField } from '@mui/material'; + +import styles from './GenresFilterForm.module.css'; + +/** Genres filter form. */ +const GenresFilterFormComponent: FC = () => ( +
+ + +); + +/** Memoized filter form. */ +export const GenresFilterForm = memo(GenresFilterFormComponent); diff --git a/apps/react/src/features/genres/components/GenresList/GenresList.module.css b/apps/react/src/features/genres/components/GenresList/GenresList.module.css new file mode 100644 index 00000000..df4bb7f2 --- /dev/null +++ b/apps/react/src/features/genres/components/GenresList/GenresList.module.css @@ -0,0 +1,18 @@ +.list { + width: 100%; + overflow-y: auto; + border: 1px var(--border-color) solid; + height: calc(100% - var(--form-field-height) - (2 * var(--space-s))); + padding-top: 0; +} + +.item { + border: 1px var(--border-color) solid; + color: var(--primary-font-color); + cursor: pointer; +} + +.item:hover, +.item:focus { + background-color: var(--hover-color); +} diff --git a/apps/react/src/features/genres/components/GenresList/GenresList.tsx b/apps/react/src/features/genres/components/GenresList/GenresList.tsx new file mode 100644 index 00000000..70967c0f --- /dev/null +++ b/apps/react/src/features/genres/components/GenresList/GenresList.tsx @@ -0,0 +1,38 @@ +import { memo, FC } from 'react'; +import { Link } from 'react-router-dom'; +import { Genre } from '@js-camp/core/models/genre'; +import { List, ListItem, IconButton, ListItemText } from '@mui/material'; +import DeleteIcon from '@mui/icons-material/Delete'; + +import { GENRES_PATH } from '../../routes'; + +import styles from './GenresList.module.css'; + +type Props = { + + /** Genres. */ + readonly genres: readonly Genre[]; +}; + +/** Genres list. */ +const GenresListComponent: FC = ({ genres }: Props) => ( + + { genres.map(genre => + + + + } + component={Link} + to={`/${GENRES_PATH}/${genre.id}`} + > + + ) } + +); + +/** Memoized genres list. */ +export const GenresList = memo(GenresListComponent); diff --git a/apps/react/src/features/genres/pages/GenresPage/GenresPage.module.css b/apps/react/src/features/genres/pages/GenresPage/GenresPage.module.css new file mode 100644 index 00000000..9ed8f7e3 --- /dev/null +++ b/apps/react/src/features/genres/pages/GenresPage/GenresPage.module.css @@ -0,0 +1,17 @@ +.main { + display: flex; + flex-direction: row; + width: 100%; + height: calc(100vh - var(--header-height)); +} + +.section { + min-width: 320px; + border: 1px var(--border-color) solid; + flex-grow: 1; +} + +.details { + width: 100%; + padding: var(--space-m); +} diff --git a/apps/react/src/features/genres/pages/GenresPage/GenresPage.tsx b/apps/react/src/features/genres/pages/GenresPage/GenresPage.tsx index 7cf2747c..5d42ddb8 100644 --- a/apps/react/src/features/genres/pages/GenresPage/GenresPage.tsx +++ b/apps/react/src/features/genres/pages/GenresPage/GenresPage.tsx @@ -1,9 +1,13 @@ import { memo, useEffect, FC } from 'react'; import { fetchGenres } from '@js-camp/react/store/genre/dispatchers'; import { selectGenres, selectAreGenresLoading } from '@js-camp/react/store/genre/selectors'; -import { useAppDispatch, useAppSelector } from '@js-camp/react/store'; +import { useAppDispatch, useAppSelector } from '@js-camp/react/store/store'; +import { Outlet } from 'react-router-dom'; -import { GenreCard } from '../../components/GenreCard'; +import { GenresFilterForm } from '../../components/GenresFilterForm/GenresFilterForm'; +import { GenresList } from '../../components/GenresList/GenresList'; + +import styles from './GenresPage.module.css'; /** Genres page component. */ const GenresPageComponent: FC = () => { @@ -20,14 +24,17 @@ const GenresPageComponent: FC = () => { } return ( - <> -

Genres

- {genres.map(genre => )} - +
+
+ + +
+
+ +
+
); }; -/** - * Memorized GenresPageComponent. - */ +/** Memoized genres page component. */ export const GenresPage = memo(GenresPageComponent); diff --git a/apps/react/src/features/genres/pages/GenresPage/index.ts b/apps/react/src/features/genres/pages/GenresPage/index.ts deleted file mode 100644 index 69257cd6..00000000 --- a/apps/react/src/features/genres/pages/GenresPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { GenresPage } from './GenresPage'; diff --git a/apps/react/src/features/genres/routes.tsx b/apps/react/src/features/genres/routes.tsx index 92312015..db80fd44 100644 --- a/apps/react/src/features/genres/routes.tsx +++ b/apps/react/src/features/genres/routes.tsx @@ -1,18 +1,34 @@ import { lazy } from 'react'; -import { Navigate, RouteObject } from 'react-router-dom'; +import { RouteObject } from 'react-router-dom'; -const GenresPage = lazy(() => import('./pages/GenresPage').then(module => ({ default: module.GenresPage }))); +import { GenreCard } from './components/GenreCard/GenreCard'; +import { GenreEditForm } from './components/GenreEditForm/GenreEditForm'; -/** - * Route object for GenresPage. - */ -export const genresRoutes: RouteObject[] = [ +const GenresPage = lazy(() => import('./pages/GenresPage/GenresPage').then(module => ({ default: module.GenresPage }))); + +/** Path to genres for url. */ +export const GENRES_PATH = 'genres'; + +/** Path to a genre for url. */ +export const GENRE_PATH = ':id'; + +/** Path to a genre editing for url. */ +export const EDIT_GENRE_PATH = 'edit'; + +/** Route object for GenresPage. */ +export const genresRoutes: readonly RouteObject[] = [ { - path: 'genres', + path: GENRES_PATH, element: , - }, - { - path: '*', - element: , + children: [ + { + path: GENRE_PATH, + element: , + }, + { + path: `${GENRE_PATH}/${EDIT_GENRE_PATH}`, + element: , + }, + ], }, ]; diff --git a/apps/react/src/features/studios/pages/StudiosPage.tsx b/apps/react/src/features/studios/pages/StudiosPage.tsx new file mode 100644 index 00000000..9a45bad8 --- /dev/null +++ b/apps/react/src/features/studios/pages/StudiosPage.tsx @@ -0,0 +1,11 @@ +import { memo, FC } from 'react'; + +/** Studios page component. */ +const StudiosPageComponent: FC = () => ( + <> +

Studios

+ +); + +/** Memoized studios page component. */ +export const StudiosPage = memo(StudiosPageComponent); diff --git a/apps/react/src/features/studios/routes.tsx b/apps/react/src/features/studios/routes.tsx new file mode 100644 index 00000000..b623b731 --- /dev/null +++ b/apps/react/src/features/studios/routes.tsx @@ -0,0 +1,15 @@ +import { lazy } from 'react'; +import { RouteObject } from 'react-router-dom'; + +const StudiosPage = lazy(() => import('./pages/StudiosPage').then(module => ({ default: module.StudiosPage }))); + +/** Path to studios for url. */ +export const STUDIOS_PATH = 'studios'; + +/** Route object for studios page. */ +export const studiosRoutes: readonly RouteObject[] = [ + { + path: STUDIOS_PATH, + element: , + }, +]; diff --git a/apps/react/src/routes/RootRouter.tsx b/apps/react/src/routes/RootRouter.tsx index 1eb8e72a..ffd78d45 100644 --- a/apps/react/src/routes/RootRouter.tsx +++ b/apps/react/src/routes/RootRouter.tsx @@ -2,13 +2,17 @@ import { FC } from 'react'; import { Navigate, RouteObject, useRoutes } from 'react-router-dom'; import { genresRoutes } from '../features/genres/routes'; +import { animeRoutes, ANIME_PATH } from '../features/anime/routes'; +import { studiosRoutes } from '../features/studios/routes'; const routes: RouteObject[] = [ { path: '*', - element: , + element: , }, + ...animeRoutes, ...genresRoutes, + ...studiosRoutes, ]; /** Root router component. */ diff --git a/apps/react/src/store/genre/dispatchers.ts b/apps/react/src/store/genre/dispatchers.ts index e5e77bf1..46865555 100644 --- a/apps/react/src/store/genre/dispatchers.ts +++ b/apps/react/src/store/genre/dispatchers.ts @@ -2,9 +2,7 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; import { GenresService } from '../../api/services/genreService'; -/** - * Function for fetch genres. - */ +/** Function for fetch genres. */ export const fetchGenres = createAsyncThunk( 'genres/fetch', () => GenresService.fetchGenres(), diff --git a/apps/react/src/store/genre/slice.ts b/apps/react/src/store/genre/slice.ts index 3c30ed3c..8fe70ecc 100644 --- a/apps/react/src/store/genre/slice.ts +++ b/apps/react/src/store/genre/slice.ts @@ -3,9 +3,7 @@ import { createSlice } from '@reduxjs/toolkit'; import { fetchGenres } from './dispatchers'; import { initialState } from './state'; -/** - * Genre slice. - */ +/** Genre slice. */ export const genresSlice = createSlice({ name: 'genres', initialState, diff --git a/apps/react/src/store/genre/state.ts b/apps/react/src/store/genre/state.ts index 0090901c..6e2dd7e7 100644 --- a/apps/react/src/store/genre/state.ts +++ b/apps/react/src/store/genre/state.ts @@ -13,9 +13,7 @@ export type GenresState = { readonly isLoading: boolean; }; -/** - * InitialState for GenresState. - */ +/** Initial state for genres state. */ export const initialState: GenresState = { isLoading: false, genres: [], diff --git a/apps/react/src/store/index.ts b/apps/react/src/store/index.ts deleted file mode 100644 index d4068169..00000000 --- a/apps/react/src/store/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './store'; diff --git a/apps/react/src/store/store.ts b/apps/react/src/store/store.ts index 46e439c7..75c0d8cb 100644 --- a/apps/react/src/store/store.ts +++ b/apps/react/src/store/store.ts @@ -5,9 +5,7 @@ import { import { genresSlice } from './genre/slice'; -/** - * Store. - */ +/** Store. */ export const store = configureStore({ reducer: { genres: genresSlice.reducer, @@ -20,20 +18,14 @@ export const store = configureStore({ }), }); -/** - * RootState type. - */ +/** Root state type. */ export type RootState = ReturnType; -/** - * AppDispatch type. - */ +/** App dispatch type. */ export type AppDispatch = typeof store.dispatch; /** Typed `useDispatch` hook. */ export const useAppDispatch = (): AppDispatch => useDispatch(); -/** - * Selector for using types. - */ +/** Selector for using types. */ export const useAppSelector: TypedUseSelectorHook = useSelector; diff --git a/apps/react/src/theme/styles.css b/apps/react/src/theme/styles.css new file mode 100644 index 00000000..a46eaacc --- /dev/null +++ b/apps/react/src/theme/styles.css @@ -0,0 +1,18 @@ +@import url("./variables.css"); + +/* Global styles. */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + font-size: 16px; +} + +body { + font-family: Roboto, "Helvetica Neue", sans-serif; +} diff --git a/apps/react/src/theme/variables.css b/apps/react/src/theme/variables.css new file mode 100644 index 00000000..2a546f9f --- /dev/null +++ b/apps/react/src/theme/variables.css @@ -0,0 +1,4 @@ +:root { + --header-height: 64px; + --form-field-height: 54px; +} diff --git a/apps/react/vite-env.d.ts b/apps/react/vite-env.d.ts index 9183a42b..144e5d79 100644 --- a/apps/react/vite-env.d.ts +++ b/apps/react/vite-env.d.ts @@ -3,12 +3,12 @@ interface ImportMetaEnv { - /** Api base url. */ - readonly VITE_APP_API_BASE_URL: string; + /** Api base url. */ + readonly VITE_APP_API_BASE_URL: string; } interface ImportMeta { - /** Contains application environment data. */ - readonly env: ImportMetaEnv; + /** Contains application environment data. */ + readonly env: ImportMetaEnv; } diff --git a/libs/theme/src/variables.css b/libs/theme/src/variables.css index 252ef95a..148ffc90 100644 --- a/libs/theme/src/variables.css +++ b/libs/theme/src/variables.css @@ -1,6 +1,6 @@ :root { /** Prevalent color in the application */ - --primary-color: rgb(249 115 22); + --primary-color: rgb(63 81 181); --primary-contrast-color: rgb(255 255 255); --primary-dark-color: rgb(234 88 12); --primary-dark-contrast-color: rgb(255 255 255); @@ -10,6 +10,11 @@ --background-contrast-color: rgb(0 0 0); --error-color: rgb(255 0 0); --border-color: rgb(0 0 0 / 15%); + --shadow-color: rgb(107 107 107 / 65%); + --hover-color: rgb(0 0 0 / 15%); + --primary-font-color: var(--primary-light-contrast-color); + --active-link-color: var(--primary-color); + --primary-background-color: var(--primary-contrast-color); /* Variables for spaces */ --space-xs: 8px; @@ -25,4 +30,10 @@ --font-size-md: 1.125rem; --font-size-lg: 1.25rem; --font-size-xl: 1.5rem; + + /* Variables for font weights */ + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; } diff --git a/package-lock.json b/package-lock.json index 6d94f69e..358dca9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,10 @@ "@angular/platform-browser": "18.0.5", "@angular/platform-browser-dynamic": "18.0.5", "@angular/router": "18.0.5", + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^5.16.7", + "@mui/material": "^5.16.7", "@reduxjs/toolkit": "1.9.3", "axios": "^1.4.0", "core-js": "^3.30.2", @@ -1613,7 +1617,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -1680,7 +1683,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, "dependencies": { "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", @@ -1819,7 +1821,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -1831,7 +1832,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" @@ -1844,7 +1844,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -1869,7 +1868,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -1982,7 +1980,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, "dependencies": { "@babel/types": "^7.24.7" }, @@ -1994,7 +1991,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -2003,7 +1999,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -2049,7 +2044,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -2064,7 +2058,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -3526,7 +3519,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/parser": "^7.24.7", @@ -3540,7 +3532,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.24.7", @@ -3561,7 +3552,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", @@ -3618,6 +3608,187 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/react": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.9.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", + "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.36.1", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", @@ -4494,7 +4665,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -4508,7 +4678,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -4517,7 +4686,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -4535,14 +4703,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5516,6 +5682,222 @@ "win32" ] }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", + "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@nabla/vite-plugin-eslint": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@nabla/vite-plugin-eslint/-/vite-plugin-eslint-1.6.0.tgz", @@ -7400,6 +7782,15 @@ "node": ">=14" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", @@ -8730,8 +9121,7 @@ "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { "version": "15.7.12", @@ -8789,6 +9179,14 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", @@ -9992,7 +10390,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -10938,7 +11335,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -11042,7 +11438,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -11269,11 +11664,18 @@ "node": ">=0.10.0" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -11281,8 +11683,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-support": { "version": "1.1.3", @@ -11491,8 +11892,7 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.6.0", @@ -12098,7 +12498,6 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -12467,6 +12866,15 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -12723,7 +13131,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -12938,7 +13345,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -14209,6 +14615,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -14655,7 +15066,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14903,7 +15313,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -15011,7 +15420,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -15077,7 +15485,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -15555,7 +15962,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -15681,8 +16087,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -15755,7 +16160,6 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -16548,7 +16952,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -16565,8 +16968,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -17950,8 +18352,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/msgpackr": { "version": "1.11.0", @@ -18705,7 +19106,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19153,7 +19553,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -19165,7 +19564,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -19182,8 +19580,7 @@ "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/parse-node-version": { "version": "1.0.1", @@ -19289,8 +19686,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -19327,7 +19723,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -19352,8 +19747,7 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "4.0.2", @@ -20218,7 +20612,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -20228,8 +20621,7 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -20456,6 +20848,21 @@ "react-dom": ">=16.8" } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -20850,7 +21257,6 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -20867,7 +21273,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -22505,6 +22910,11 @@ "node": ">=8" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/stylus": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", @@ -22601,7 +23011,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -22647,7 +23056,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -23016,7 +23424,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -25115,7 +25522,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } diff --git a/package.json b/package.json index 4578c472..73b9b4a2 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,10 @@ "@angular/platform-browser": "18.0.5", "@angular/platform-browser-dynamic": "18.0.5", "@angular/router": "18.0.5", + "@emotion/react": "^11.13.0", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^5.16.7", + "@mui/material": "^5.16.7", "@reduxjs/toolkit": "1.9.3", "axios": "^1.4.0", "core-js": "^3.30.2",