diff --git a/.eslintrc.json b/.eslintrc.json index bffb357..2dc827e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,76 @@ { - "extends": "next/core-web-vitals" + "extends": [ + "next/core-web-vitals", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "rules": { + "react/display-name": "off", + "@next/next/no-img-element": "off", + "react/no-unescaped-entities": "off", + "import/no-anonymous-default-export": "off", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + // add new line above comment + "lines-around-comment": [ + "error", + { + "beforeLineComment": true, + "beforeBlockComment": true, + "allowBlockStart": true, + "allowClassStart": true, + "allowObjectStart": true, + "allowArrayStart": true + } + ], + // add new line above return + "newline-before-return": "error", + // add new line below import + "import/newline-after-import": [ + "error", + { + "count": 1 + } + ], + "@typescript-eslint/ban-types": [ + "error", + { + "extendDefaults": true, + "types": { + "{}": false + } + } + ] + }, + "plugins": [ + "import" + ], + "settings": { + "import/parsers": { + "@typescript-eslint/parser": [ + ".ts", + ".tsx" + ] + }, + "import/resolver": { + "typescript": { + "alwaysTryTypes": true, + "project": [ + "./tsconfig.json" + ] + } + } + }, + "overrides": [ + { + "files": [ + "src/iconify-bundle/*" + ], + "rules": { + "@typescript-eslint/no-var-requires": "off" + } + } + ] } diff --git a/.gitignore b/.gitignore index fd3dbb5..b988ee9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ /node_modules /.pnp .pnp.js -.yarn/install-state.gz # testing /coverage @@ -33,4 +32,3 @@ yarn-error.log* # typescript *.tsbuildinfo -next-env.d.ts diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..36c1742 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,17 @@ +module.exports = { + arrowParens: 'avoid', + bracketSpacing: true, + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + bracketSameLine: false, + jsxSingleQuote: true, + printWidth: 120, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: false +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..cc8b8ba --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: debug server-side", + "type": "node-terminal", + "request": "launch", + "command": "yarn dev" + }, + { + "name": "Next.js: debug client-side", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000" + }, + { + "name": "Next.js: debug full stack", + "type": "node-terminal", + "request": "launch", + "command": "yarn dev", + "serverReadyAction": { + "pattern": "- Local:.+(https?://.+)", + "uriFormat": "%s", + "action": "debugWithChrome" + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..be685cb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.quickSuggestions": { + "strings": true + }, +} diff --git a/app/401.tsx b/app/401.tsx new file mode 100644 index 0000000..eabf2dd --- /dev/null +++ b/app/401.tsx @@ -0,0 +1,64 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Components +import Button from '@mui/material/Button' +import { styled } from '@mui/material/styles' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Demo Imports +import FooterIllustrations from 'src/views/pages/misc/FooterIllustrations' + +// ** Styled Components +const BoxWrapper = styled(Box)(({ theme }) => ({ + [theme.breakpoints.down('md')]: { + width: '90vw' + } +})) + +const Img = styled('img')(({ theme }) => ({ + [theme.breakpoints.down('lg')]: { + height: 450, + marginTop: theme.spacing(10) + }, + [theme.breakpoints.down('md')]: { + height: 400 + }, + [theme.breakpoints.up('lg')]: { + marginTop: theme.spacing(20) + } +})) + +const Error401 = () => { + return ( + + + + + You are not authorized! + + + You do not have permission to view this page using the credentials that you have provided while login. + + Please contact your site administrator. + + + error-illustration + + + + ) +} + +Error401.getLayout = (page: ReactNode) => {page} + +export default Error401 diff --git a/app/404.tsx b/app/404.tsx new file mode 100644 index 0000000..4230d20 --- /dev/null +++ b/app/404.tsx @@ -0,0 +1,63 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Components +import Button from '@mui/material/Button' +import { styled } from '@mui/material/styles' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Demo Imports +import FooterIllustrations from 'src/views/pages/misc/FooterIllustrations' + +// ** Styled Components +const BoxWrapper = styled(Box)(({ theme }) => ({ + [theme.breakpoints.down('md')]: { + width: '90vw' + } +})) + +const Img = styled('img')(({ theme }) => ({ + [theme.breakpoints.down('lg')]: { + height: 450, + marginTop: theme.spacing(10) + }, + [theme.breakpoints.down('md')]: { + height: 400 + }, + [theme.breakpoints.up('lg')]: { + marginTop: theme.spacing(20) + } +})) + +const Error404 = () => { + return ( + + + + + Page Not Found :( + + + Oops! 😖 The requested URL was not found on this server. + + + + error-illustration + + + + ) +} + +Error404.getLayout = (page: ReactNode) => {page} + +export default Error404 diff --git a/app/500.tsx b/app/500.tsx new file mode 100644 index 0000000..f9d3382 --- /dev/null +++ b/app/500.tsx @@ -0,0 +1,63 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Components +import Button from '@mui/material/Button' +import { styled } from '@mui/material/styles' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Demo Imports +import FooterIllustrations from 'src/views/pages/misc/FooterIllustrations' + +// ** Styled Components +const BoxWrapper = styled(Box)(({ theme }) => ({ + [theme.breakpoints.down('md')]: { + width: '90vw' + } +})) + +const Img = styled('img')(({ theme }) => ({ + [theme.breakpoints.down('lg')]: { + height: 450, + marginTop: theme.spacing(10) + }, + [theme.breakpoints.down('md')]: { + height: 400 + }, + [theme.breakpoints.up('lg')]: { + marginTop: theme.spacing(20) + } +})) + +const Error500 = () => { + return ( + + + + + Oops, something went wrong! + + + There was an error with the internal server. Please contact your site administrator. + + + + error-illustration + + + + ) +} + +Error500.getLayout = (page: ReactNode) => {page} + +export default Error500 diff --git a/app/_app.tsx b/app/_app.tsx new file mode 100644 index 0000000..cc04bd0 --- /dev/null +++ b/app/_app.tsx @@ -0,0 +1,161 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** Next Imports +import Head from 'next/head' +import { Router } from 'next/router' +import type { NextPage } from 'next' +import type { AppProps } from 'next/app' + + + + + +// ** Loader Import +import NProgress from 'nprogress' + +// ** Emotion Imports +import { CacheProvider } from '@emotion/react' +import type { EmotionCache } from '@emotion/cache' + +// ** Config Imports + +import { defaultACLObj } from 'src/configs/acl' +import themeConfig from 'src/configs/themeConfig' + +// ** Fake-DB Import +import 'src/@fake-db' + +// ** Third Party Import +import { Toaster } from 'react-hot-toast' + +// ** Component Imports +import UserLayout from 'app/layouts/UserLayout' +import AclGuard from 'src/@core/components/auth/AclGuard' +import ThemeComponent from 'src/@core/theme/ThemeComponent' +import AuthGuard from 'src/@core/components/auth/AuthGuard' +import GuestGuard from 'src/@core/components/auth/GuestGuard' +import WindowWrapper from 'src/@core/components/window-wrapper' + +// ** Spinner Import +import Spinner from 'src/@core/components/spinner' + +// ** Contexts +import { AuthProvider } from 'src/context/AuthContext' +import { SettingsConsumer, SettingsProvider } from 'src/@core/context/settingsContext' + +// ** Styled Components +import ReactHotToast from 'src/@core/styles/libs/react-hot-toast' + +// ** Utils Imports +import { createEmotionCache } from 'src/@core/utils/create-emotion-cache' + +// ** Prismjs Styles +import 'prismjs' +import 'prismjs/themes/prism-tomorrow.css' +import 'prismjs/components/prism-jsx' +import 'prismjs/components/prism-tsx' + +// ** React Perfect Scrollbar Style +import 'react-perfect-scrollbar/dist/css/styles.css' + +import 'src/iconify-bundle/icons-bundle-react' + +// ** Global css styles +import '../../styles/globals.css' + +// ** Extend App Props with Emotion +type ExtendedAppProps = AppProps & { + Component: NextPage + emotionCache: EmotionCache +} + +type GuardProps = { + authGuard: boolean + guestGuard: boolean + children: ReactNode +} + +const clientSideEmotionCache = createEmotionCache() + +// ** Pace Loader +if (themeConfig.routingLoader) { + Router.events.on('routeChangeStart', () => { + NProgress.start() + }) + Router.events.on('routeChangeError', () => { + NProgress.done() + }) + Router.events.on('routeChangeComplete', () => { + NProgress.done() + }) +} + +const Guard = ({ children, authGuard, guestGuard }: GuardProps) => { + if (guestGuard) { + return }>{children} + } else if (!guestGuard && !authGuard) { + return <>{children} + } else { + return }>{children} + } +} + +// ** Configure JSS & ClassName +const App = (props: ExtendedAppProps) => { + const { Component, emotionCache = clientSideEmotionCache, pageProps } = props + + // Variables + const contentHeightFixed = Component.contentHeightFixed ?? false + const getLayout = + Component.getLayout ?? (page => {page}) + + const setConfig = Component.setConfig ?? undefined + + const authGuard = Component.authGuard ?? true + + const guestGuard = Component.guestGuard ?? false + + const aclAbilities = Component.acl ?? defaultACLObj + + return ( + + + + {`${themeConfig.templateName} - Material Design React Admin Template`} + + + + + + + + + {({ settings }) => { + return ( + + + + + {getLayout()} + + + + + + + + ) + }} + + + + + + ) +} + +export default App diff --git a/app/acl/page.tsx b/app/acl/page.tsx new file mode 100644 index 0000000..2144cd2 --- /dev/null +++ b/app/acl/page.tsx @@ -0,0 +1,49 @@ +// ** React Imports +import { useContext } from 'react' + +// ** Context Imports +import { AbilityContext } from 'app/layouts/components/acl/Can' + +// ** MUI Imports +import Grid from '@mui/material/Grid' +import Card from '@mui/material/Card' +import CardHeader from '@mui/material/CardHeader' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +const ACLPage = () => { + // ** Hooks + const ability = useContext(AbilityContext) + + return ( + + + + + + No ability is required to view this card + This card is visible to 'user' and 'admin' both + + + + {ability?.can('read', 'analytics') ? ( + + + + + User with 'Analytics' subject's 'Read' ability can view this card + This card is visible to 'admin' only + + + + ) : null} + + ) +} + +ACLPage.acl = { + action: 'read', + subject: 'acl-page' +} + +export default ACLPage diff --git a/app/forgot-password/page.tsx b/app/forgot-password/page.tsx new file mode 100644 index 0000000..d2ea201 --- /dev/null +++ b/app/forgot-password/page.tsx @@ -0,0 +1,159 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Components +import Button from '@mui/material/Button' +import TextField from '@mui/material/TextField' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' +import useMediaQuery from '@mui/material/useMediaQuery' +import { styled, useTheme } from '@mui/material/styles' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Demo Imports +import FooterIllustrationsV2 from 'src/views/pages/auth/FooterIllustrationsV2' + +// Styled Components +const ForgotPasswordIllustration = styled('img')(({ theme }) => ({ + zIndex: 2, + maxHeight: 650, + marginTop: theme.spacing(12), + marginBottom: theme.spacing(12), + [theme.breakpoints.down(1540)]: { + maxHeight: 550 + }, + [theme.breakpoints.down('lg')]: { + maxHeight: 500 + } +})) + +const RightWrapper = styled(Box)(({ theme }) => ({ + width: '100%', + [theme.breakpoints.up('md')]: { + maxWidth: 450 + }, + [theme.breakpoints.up('lg')]: { + maxWidth: 600 + }, + [theme.breakpoints.up('xl')]: { + maxWidth: 750 + } +})) + +const LinkStyled = styled(Link)(({ theme }) => ({ + display: 'flex', + fontSize: '1rem', + alignItems: 'center', + textDecoration: 'none', + justifyContent: 'center', + color: theme.palette.primary.main +})) + +const ForgotPassword = () => { + // ** Hooks + const theme = useTheme() + + // ** Vars + const hidden = useMediaQuery(theme.breakpoints.down('md')) + + return ( + + {!hidden ? ( + theme.spacing(8, 0, 8, 8) + }} + > + + + + ) : null} + + + + + + + + + + + + Forgot Password? 🔒 + + + Enter your email and we′ll send you instructions to reset your password + + +
e.preventDefault()}> + + + + + + Back to login + + + +
+
+
+
+ ) +} + +ForgotPassword.getLayout = (page: ReactNode) => {page} + +ForgotPassword.guestGuard = true + +export default ForgotPassword diff --git a/app/globals.css b/app/globals.css index 875c01e..af3fb24 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,33 +1,24 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - +html, body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); + min-height: 100%; } -@layer utilities { - .text-balance { - text-wrap: balance; - } +#__next { + height: 100%; +} + +code { + font-family: 'Public Sans', sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', + 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue'; + padding: 0.1rem 0.4rem; + font-size: 90%; + color: #d400ff; + border-radius: 0.1335rem; +} +code:not([class*='language-']):before, +code:not([class*='language-']):after { + content: '`'; +} +code[class*='language-'] { + padding: 0; } diff --git a/app/home/page.tsx b/app/home/page.tsx new file mode 100644 index 0000000..6b57953 --- /dev/null +++ b/app/home/page.tsx @@ -0,0 +1,40 @@ +"use client" + +// ** MUI Imports +import Card from '@mui/material/Card' +import Grid from '@mui/material/Grid' +import Typography from '@mui/material/Typography' +import CardHeader from '@mui/material/CardHeader' +import CardContent from '@mui/material/CardContent' + +const Home = () => { + return ( + + + + + + All the best for your new project. + + Please make sure to read our Template Documentation to understand where to go from here and how to use our + template. + + + + + + + + + + Access Control (ACL) and Authentication (JWT) are the two main security features of our template and are implemented in the starter-kit as well. + + Please read our Authentication and ACL Documentations to get more out of them. + + + + + ) +} + +export default Home diff --git a/app/index.tsx b/app/index.tsx new file mode 100644 index 0000000..6e35d3c --- /dev/null +++ b/app/index.tsx @@ -0,0 +1,45 @@ +"use client" + +// ** React Imports +import { useEffect } from 'react' + +// ** Next Imports +import { useRouter } from 'next/router' + +// ** Spinner Import +import Spinner from 'src/@core/components/spinner' + +// ** Hook Imports +import { useAuth } from 'src/hooks/useAuth' + +/** + * Set Home URL based on User Roles + */ +export const getHomeRoute = (role: string) => { + if (role === 'client') return '/acl' + else return '/home' +} + +const Home = () => { + // ** Hooks + const auth = useAuth() + const router = useRouter() + + useEffect(() => { + if (!router.isReady) { + return + } + + if (auth.user && auth.user.role) { + const homeRoute = getHomeRoute(auth.user.role) + + // Redirect user to Home URL + router.replace(homeRoute) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return +} + +export default Home diff --git a/app/layout.tsx b/app/layout.tsx index 3314e47..129c55b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,8 +5,8 @@ import "./globals.css"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Face Recognition", + description: "Developed by Productzilla", }; export default function RootLayout({ diff --git a/app/layouts/UserLayout.tsx b/app/layouts/UserLayout.tsx new file mode 100644 index 0000000..4a12c9b --- /dev/null +++ b/app/layouts/UserLayout.tsx @@ -0,0 +1,98 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** MUI Imports +import { Theme } from '@mui/material/styles' +import useMediaQuery from '@mui/material/useMediaQuery' + +// ** Layout Imports +// !Do not remove this Layout import +import Layout from 'src/@core/layouts/Layout' + +// ** Navigation Imports +import VerticalNavItems from 'src/navigation/vertical' +import HorizontalNavItems from 'src/navigation/horizontal' + +// ** Component Import +// Uncomment the below line (according to the layout type) when using server-side menu +// import ServerSideVerticalNavItems from './components/vertical/ServerSideNavItems' +// import ServerSideHorizontalNavItems from './components/horizontal/ServerSideNavItems' + +import VerticalAppBarContent from './components/vertical/AppBarContent' +import HorizontalAppBarContent from './components/horizontal/AppBarContent' + +// ** Hook Import +import { useSettings } from 'src/@core/hooks/useSettings' + +interface Props { + children: ReactNode + contentHeightFixed?: boolean +} + +const UserLayout = ({ children, contentHeightFixed }: Props) => { + // ** Hooks + const { settings, saveSettings } = useSettings() + + // ** Vars for server side navigation + // const { menuItems: verticalMenuItems } = ServerSideVerticalNavItems() + // const { menuItems: horizontalMenuItems } = ServerSideHorizontalNavItems() + + /** + * The below variable will hide the current layout menu at given screen size. + * The menu will be accessible from the Hamburger icon only (Vertical Overlay Menu). + * You can change the screen size from which you want to hide the current layout menu. + * Please refer useMediaQuery() hook: https://mui.com/material-ui/react-use-media-query/, + * to know more about what values can be passed to this hook. + * ! Do not change this value unless you know what you are doing. It can break the template. + */ + const hidden = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg')) + + if (hidden && settings.layout === 'horizontal') { + settings.layout = 'vertical' + } + + return ( + + ) +} + +export default UserLayout diff --git a/app/layouts/UserThemeOptions.ts b/app/layouts/UserThemeOptions.ts new file mode 100644 index 0000000..45973b7 --- /dev/null +++ b/app/layouts/UserThemeOptions.ts @@ -0,0 +1,185 @@ +// ** MUI Imports +import { ThemeOptions } from '@mui/system' + +// ** To use core palette, uncomment the below import +// import { PaletteMode } from '@mui/material' + +// ** To use core palette, uncomment the below import +// import corePalette from 'src/@core/theme/palette' + +// ** To use mode (light/dark/semi-dark), skin(default/bordered), direction(ltr/rtl), etc. for conditional styles, uncomment below line +// import { useSettings } from 'src/@core/hooks/useSettings' + +const UserThemeOptions = (): ThemeOptions => { + // ** To use mode (light/dark/semi-dark), skin(default/bordered), direction(ltr/rtl), etc. for conditional styles, uncomment below line + // const { settings } = useSettings() + + // ** To use mode (light/dark/semi-dark), skin(default/bordered), direction(ltr/rtl), etc. for conditional styles, uncomment below line + // const { mode, skin } = settings + + // ** To use core palette, uncomment the below line + // const palette = corePalette(mode as PaletteMode, skin) + + return { + /* + palette:{ + primary: { + light: '#8479F2', + main: '#7367F0', + dark: '#655BD3', + contrastText: '#FFF' + } + }, + breakpoints: { + values: { + xs: 0, + sm: 768, + md: 992, + lg: 1200, + xl: 1920 + } + }, + components: { + MuiButton: { + defaultProps: { + disableElevation: true + }, + styleOverrides: { + root: { + textTransform: 'none' + }, + sizeSmall: { + padding: '6px 16px' + }, + sizeMedium: { + padding: '8px 20px' + }, + sizeLarge: { + padding: '11px 24px' + }, + textSizeSmall: { + padding: '7px 12px' + }, + textSizeMedium: { + padding: '9px 16px' + }, + textSizeLarge: { + padding: '12px 16px' + } + } + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: '16px 24px' + } + } + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: '32px 24px', + '&:last-child': { + paddingBottom: '32px' + } + } + } + }, + MuiCssBaseline: { + styleOverrides: { + '*': { + boxSizing: 'border-box' + }, + html: { + MozOsxFontSmoothing: 'grayscale', + WebkitFontSmoothing: 'antialiased', + display: 'flex', + flexDirection: 'column', + minHeight: '100%', + width: '100%' + }, + body: { + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', + minHeight: '100%', + width: '100%' + }, + '#__next': { + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', + height: '100%', + width: '100%' + } + } + } + }, + shape: { + borderRadius: 8 + }, + typography: { + fontFamily: + '"Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"', + }, + shadows: mode === 'light' ? [ + 'none', + '0px 2px 4px 1px rgba(51, 48, 60, 0.03), 0px 3px 4px 0px rgba(51, 48, 60, 0.02), 0px 1px 3px 2px rgba(51, 48, 60, 0.01)', + '0px 3px 5px 2px rgba(51, 48, 60, 0.03), 0px 3px 5px 0px rgba(51, 48, 60, 0.02), 0px 1px 4px 2px rgba(51, 48, 60, 0.01)', + '0px 3px 6px 2px rgba(51, 48, 60, 0.03), 0px 4px 6px 0px rgba(51, 48, 60, 0.02), 0px 1px 4px 2px rgba(51, 48, 60, 0.01)', + '0px 2px 7px 1px rgba(51, 48, 60, 0.03), 0px 4px 7px 0px rgba(51, 48, 60, 0.02), 0px 1px 4px 2px rgba(51, 48, 60, 0.01)', + '0px 3px 8px 1px rgba(51, 48, 60, 0.03), 0px 6px 8px 0px rgba(51, 48, 60, 0.02), 0px 1px 5px 4px rgba(51, 48, 60, 0.01)', + '0px 3px 9px 1px rgba(51, 48, 60, 0.03), 0px 8px 9px 0px rgba(51, 48, 60, 0.02), 0px 1px 6px 4px rgba(51, 48, 60, 0.01)', + '0px 4px 10px 2px rgba(51, 48, 60, 0.03), 0px 9px 10px 1px rgba(51, 48, 60, 0.02), 0px 2px 7px 4px rgba(51, 48, 60, 0.01)', + '0px 5px 11px 3px rgba(51, 48, 60, 0.03), 0px 8px 11px 1px rgba(51, 48, 60, 0.02), 0px 3px 8px 4px rgba(51, 48, 60, 0.01)', + '0px 5px 12px 3px rgba(51, 48, 60, 0.03), 0px 9px 12px 1px rgba(51, 48, 60, 0.02), 0px 3px 9px 5px rgba(51, 48, 60, 0.01)', + '0px 6px 13px 3px rgba(51, 48, 60, 0.03), 0px 10px 13px 1px rgba(51, 48, 60, 0.02), 0px 4px 10px 5px rgba(51, 48, 60, 0.01)', + '0px 6px 14px 4px rgba(51, 48, 60, 0.03), 0px 11px 14px 1px rgba(51, 48, 60, 0.02), 0px 4px 11px 5px rgba(51, 48, 60, 0.01)', + '0px 7px 15px 4px rgba(51, 48, 60, 0.03), 0px 12px 15px 2px rgba(51, 48, 60, 0.02), 0px 5px 12px 5px rgba(51, 48, 60, 0.01)', + '0px 7px 16px 4px rgba(51, 48, 60, 0.03), 0px 13px 16px 2px rgba(51, 48, 60, 0.02), 0px 5px 13px 6px rgba(51, 48, 60, 0.01)', + '0px 7px 17px 4px rgba(51, 48, 60, 0.03), 0px 14px 17px 2px rgba(51, 48, 60, 0.02), 0px 5px 14px 6px rgba(51, 48, 60, 0.01)', + '0px 8px 18px 5px rgba(51, 48, 60, 0.03), 0px 15px 18px 2px rgba(51, 48, 60, 0.02), 0px 6px 15px 6px rgba(51, 48, 60, 0.01)', + '0px 8px 19px 5px rgba(51, 48, 60, 0.03), 0px 16px 19px 2px rgba(51, 48, 60, 0.02), 0px 6px 16px 6px rgba(51, 48, 60, 0.01)', + '0px 8px 20px 5px rgba(51, 48, 60, 0.03), 0px 17px 20px 2px rgba(51, 48, 60, 0.02), 0px 6px 17px 7px rgba(51, 48, 60, 0.01)', + '0px 9px 21px 5px rgba(51, 48, 60, 0.03), 0px 18px 21px 2px rgba(51, 48, 60, 0.02), 0px 7px 18px 7px rgba(51, 48, 60, 0.01)', + '0px 9px 22px 6px rgba(51, 48, 60, 0.03), 0px 19px 22px 2px rgba(51, 48, 60, 0.02), 0px 7px 19px 7px rgba(51, 48, 60, 0.01)', + '0px 10px 23px 6px rgba(51, 48, 60, 0.03), 0px 20px 23px 3px rgba(51, 48, 60, 0.02), 0px 8px 20px 7px rgba(51, 48, 60, 0.01)', + '0px 10px 24px 6px rgba(51, 48, 60, 0.03), 0px 21px 24px 3px rgba(51, 48, 60, 0.02), 0px 8px 21px 7px rgba(51, 48, 60, 0.01)', + '0px 10px 25px 6px rgba(51, 48, 60, 0.03), 0px 22px 25px 3px rgba(51, 48, 60, 0.02), 0px 8px 22px 7px rgba(51, 48, 60, 0.01)', + '0px 11px 26px 7px rgba(51, 48, 60, 0.03), 0px 23px 26px 3px rgba(51, 48, 60, 0.02), 0px 9px 23px 7px rgba(51, 48, 60, 0.01)', + '0px 11px 27px 7px rgba(51, 48, 60, 0.03), 0px 24px 27px 3px rgba(51, 48, 60, 0.02), 0px 9px 24px 7px rgba(51, 48, 60, 0.01)' + ] : [ + 'none', + '0px 2px 4px 1px rgba(12, 16, 27, 0.15), 0px 3px 4px 0px rgba(12, 16, 27, 0.1), 0px 1px 3px 2px rgba(12, 16, 27, 0.08)', + '0px 3px 5px 2px rgba(12, 16, 27, 0.15), 0px 3px 5px 0px rgba(12, 16, 27, 0.1), 0px 1px 4px 2px rgba(12, 16, 27, 0.08)', + '0px 3px 6px 2px rgba(12, 16, 27, 0.15), 0px 4px 6px 0px rgba(12, 16, 27, 0.1), 0px 1px 4px 2px rgba(12, 16, 27, 0.08)', + '0px 2px 7px 1px rgba(12, 16, 27, 0.15), 0px 4px 7px 0px rgba(12, 16, 27, 0.1), 0px 1px 4px 2px rgba(12, 16, 27, 0.08)', + '0px 3px 8px 1px rgba(12, 16, 27, 0.15), 0px 6px 8px 0px rgba(12, 16, 27, 0.1), 0px 1px 5px 4px rgba(12, 16, 27, 0.08)', + '0px 3px 9px 1px rgba(12, 16, 27, 0.15), 0px 8px 9px 0px rgba(12, 16, 27, 0.1), 0px 1px 6px 4px rgba(12, 16, 27, 0.08)', + '0px 4px 10px 2px rgba(12, 16, 27, 0.15), 0px 9px 10px 1px rgba(12, 16, 27, 0.1), 0px 2px 7px 4px rgba(12, 16, 27, 0.08)', + '0px 5px 11px 3px rgba(12, 16, 27, 0.15), 0px 8px 11px 1px rgba(12, 16, 27, 0.1), 0px 3px 8px 4px rgba(12, 16, 27, 0.08)', + '0px 5px 12px 3px rgba(12, 16, 27, 0.15), 0px 9px 12px 1px rgba(12, 16, 27, 0.1), 0px 3px 9px 5px rgba(12, 16, 27, 0.08)', + '0px 6px 13px 3px rgba(12, 16, 27, 0.15), 0px 10px 13px 1px rgba(12, 16, 27, 0.1), 0px 4px 10px 5px rgba(12, 16, 27, 0.08)', + '0px 6px 14px 4px rgba(12, 16, 27, 0.15), 0px 11px 14px 1px rgba(12, 16, 27, 0.1), 0px 4px 11px 5px rgba(12, 16, 27, 0.08)', + '0px 7px 15px 4px rgba(12, 16, 27, 0.15), 0px 12px 15px 2px rgba(12, 16, 27, 0.1), 0px 5px 12px 5px rgba(12, 16, 27, 0.08)', + '0px 7px 16px 4px rgba(12, 16, 27, 0.15), 0px 13px 16px 2px rgba(12, 16, 27, 0.1), 0px 5px 13px 6px rgba(12, 16, 27, 0.08)', + '0px 7px 17px 4px rgba(12, 16, 27, 0.15), 0px 14px 17px 2px rgba(12, 16, 27, 0.1), 0px 5px 14px 6px rgba(12, 16, 27, 0.08)', + '0px 8px 18px 5px rgba(12, 16, 27, 0.15), 0px 15px 18px 2px rgba(12, 16, 27, 0.1), 0px 6px 15px 6px rgba(12, 16, 27, 0.08)', + '0px 8px 19px 5px rgba(12, 16, 27, 0.15), 0px 16px 19px 2px rgba(12, 16, 27, 0.1), 0px 6px 16px 6px rgba(12, 16, 27, 0.08)', + '0px 8px 20px 5px rgba(12, 16, 27, 0.15), 0px 17px 20px 2px rgba(12, 16, 27, 0.1), 0px 6px 17px 7px rgba(12, 16, 27, 0.08)', + '0px 9px 21px 5px rgba(12, 16, 27, 0.15), 0px 18px 21px 2px rgba(12, 16, 27, 0.1), 0px 7px 18px 7px rgba(12, 16, 27, 0.08)', + '0px 9px 22px 6px rgba(12, 16, 27, 0.15), 0px 19px 22px 2px rgba(12, 16, 27, 0.1), 0px 7px 19px 7px rgba(12, 16, 27, 0.08)', + '0px 10px 23px 6px rgba(12, 16, 27, 0.15), 0px 20px 23px 3px rgba(12, 16, 27, 0.1), 0px 8px 20px 7px rgba(12, 16, 27, 0.08)', + '0px 10px 24px 6px rgba(12, 16, 27, 0.15), 0px 21px 24px 3px rgba(12, 16, 27, 0.1), 0px 8px 21px 7px rgba(12, 16, 27, 0.08)', + '0px 10px 25px 6px rgba(12, 16, 27, 0.15), 0px 22px 25px 3px rgba(12, 16, 27, 0.1), 0px 8px 22px 7px rgba(12, 16, 27, 0.08)', + '0px 11px 26px 7px rgba(12, 16, 27, 0.15), 0px 23px 26px 3px rgba(12, 16, 27, 0.1), 0px 9px 23px 7px rgba(12, 16, 27, 0.08)', + '0px 11px 27px 7px rgba(12, 16, 27, 0.15), 0px 24px 27px 3px rgba(12, 16, 27, 0.1), 0px 9px 24px 7px rgba(12, 16, 27, 0.08)' + ], + zIndex: { + appBar: 1200, + drawer: 1100 + } */ + } +} + +export default UserThemeOptions diff --git a/app/layouts/components/Direction.tsx b/app/layouts/components/Direction.tsx new file mode 100644 index 0000000..8d1a02a --- /dev/null +++ b/app/layouts/components/Direction.tsx @@ -0,0 +1,41 @@ +// ** React Imports +import { useEffect, ReactNode } from 'react' + +// ** MUI Imports +import { Direction as DirectionProp } from '@mui/material' + + +// ** Emotion Imports +import createCache from '@emotion/cache' +import { CacheProvider } from '@emotion/react' + +// ** RTL Plugin +import stylisRTLPlugin from 'stylis-plugin-rtl' + +interface DirectionProps { + children: ReactNode + direction: DirectionProp +} + +const styleCache = () => + createCache({ + key: 'rtl', + prepend: true, + stylisPlugins: [stylisRTLPlugin] + }) + +const Direction = (props: DirectionProps) => { + const { children, direction } = props + + useEffect(() => { + document.dir = direction + }, [direction]) + + if (direction === 'rtl') { + return {children} + } + + return <>{children} +} + +export default Direction diff --git a/app/layouts/components/Translations.tsx b/app/layouts/components/Translations.tsx new file mode 100644 index 0000000..b53b667 --- /dev/null +++ b/app/layouts/components/Translations.tsx @@ -0,0 +1,15 @@ + + + +interface Props { + text: string +} + +const Translations = ({ text }: Props) => { + + + + return <>{text} +} + +export default Translations diff --git a/app/layouts/components/UserIcon.tsx b/app/layouts/components/UserIcon.tsx new file mode 100644 index 0000000..7288156 --- /dev/null +++ b/app/layouts/components/UserIcon.tsx @@ -0,0 +1,11 @@ +// ** Type Import +import { IconProps } from '@iconify/react' + +// ** Custom Icon Import +import Icon from 'src/@core/components/icon' + +const UserIcon = ({ icon, ...rest }: IconProps) => { + return +} + +export default UserIcon diff --git a/app/layouts/components/acl/Can.tsx b/app/layouts/components/acl/Can.tsx new file mode 100644 index 0000000..5c57920 --- /dev/null +++ b/app/layouts/components/acl/Can.tsx @@ -0,0 +1,7 @@ +import { createContext } from 'react' +import { AnyAbility } from '@casl/ability' +import { createContextualCan } from '@casl/react' + +export const AbilityContext = createContext(undefined!) + +export default createContextualCan(AbilityContext.Consumer) diff --git a/app/layouts/components/acl/CanViewNavGroup.tsx b/app/layouts/components/acl/CanViewNavGroup.tsx new file mode 100644 index 0000000..2a31934 --- /dev/null +++ b/app/layouts/components/acl/CanViewNavGroup.tsx @@ -0,0 +1,45 @@ +// ** React Imports +import { ReactNode, useContext } from 'react' + +// ** Component Imports +import { AbilityContext } from 'app/layouts/components/acl/Can' + +// ** Types +import { NavGroup, NavLink } from 'src/@core/layouts/types' + +interface Props { + navGroup?: NavGroup + children: ReactNode +} + +const CanViewNavGroup = (props: Props) => { + // ** Props + const { children, navGroup } = props + + // ** Hook + const ability = useContext(AbilityContext) + + const checkForVisibleChild = (arr: NavLink[] | NavGroup[]): boolean => { + return arr.some((i: NavGroup) => { + if (i.children) { + return checkForVisibleChild(i.children) + } else { + return ability?.can(i.action, i.subject) + } + }) + } + + const canViewMenuGroup = (item: NavGroup) => { + const hasAnyVisibleChild = item.children && checkForVisibleChild(item.children) + + if (!(item.action && item.subject)) { + return hasAnyVisibleChild + } + + return ability && ability.can(item.action, item.subject) && hasAnyVisibleChild + } + + return navGroup && canViewMenuGroup(navGroup) ? <>{children} : null +} + +export default CanViewNavGroup diff --git a/app/layouts/components/acl/CanViewNavLink.tsx b/app/layouts/components/acl/CanViewNavLink.tsx new file mode 100644 index 0000000..57f7d37 --- /dev/null +++ b/app/layouts/components/acl/CanViewNavLink.tsx @@ -0,0 +1,25 @@ +// ** React Imports +import { ReactNode, useContext } from 'react' + +// ** Component Imports +import { AbilityContext } from 'app/layouts/components/acl/Can' + +// ** Types +import { NavLink } from 'src/@core/layouts/types' + +interface Props { + navLink?: NavLink + children: ReactNode +} + +const CanViewNavLink = (props: Props) => { + // ** Props + const { children, navLink } = props + + // ** Hook + const ability = useContext(AbilityContext) + + return ability && ability.can(navLink?.action, navLink?.subject) ? <>{children} : null +} + +export default CanViewNavLink diff --git a/app/layouts/components/acl/CanViewNavSectionTitle.tsx b/app/layouts/components/acl/CanViewNavSectionTitle.tsx new file mode 100644 index 0000000..3a854a3 --- /dev/null +++ b/app/layouts/components/acl/CanViewNavSectionTitle.tsx @@ -0,0 +1,25 @@ +// ** React Imports +import { ReactNode, useContext } from 'react' + +// ** Component Imports +import { AbilityContext } from 'app/layouts/components/acl/Can' + +// ** Types +import { NavSectionTitle } from 'src/@core/layouts/types' + +interface Props { + children: ReactNode + navTitle?: NavSectionTitle +} + +const CanViewNavSectionTitle = (props: Props) => { + // ** Props + const { children, navTitle } = props + + // ** Hook + const ability = useContext(AbilityContext) + + return ability && ability.can(navTitle?.action, navTitle?.subject) ? <>{children} : null +} + +export default CanViewNavSectionTitle diff --git a/app/layouts/components/horizontal/AppBarContent.tsx b/app/layouts/components/horizontal/AppBarContent.tsx new file mode 100644 index 0000000..03e21dd --- /dev/null +++ b/app/layouts/components/horizontal/AppBarContent.tsx @@ -0,0 +1,27 @@ +// ** MUI Imports +import Box from '@mui/material/Box' + +// ** Type Import +import { Settings } from 'src/@core/context/settingsContext' + +// ** Components +import ModeToggler from 'src/@core/layouts/components/shared-components/ModeToggler' +import UserDropdown from 'src/@core/layouts/components/shared-components/UserDropdown' + +interface Props { + settings: Settings + saveSettings: (values: Settings) => void +} +const AppBarContent = (props: Props) => { + // ** Props + const { settings, saveSettings } = props + + return ( + + + + + ) +} + +export default AppBarContent diff --git a/app/layouts/components/horizontal/ServerSideNavItems.tsx b/app/layouts/components/horizontal/ServerSideNavItems.tsx new file mode 100644 index 0000000..7acfba2 --- /dev/null +++ b/app/layouts/components/horizontal/ServerSideNavItems.tsx @@ -0,0 +1,25 @@ +// ** React Imports +import { useEffect, useState } from 'react' + +// ** Axios Import +import axios from 'axios' + +// ** Type Import +import { HorizontalNavItemsType } from 'src/@core/layouts/types' + +const ServerSideNavItems = () => { + // ** State + const [menuItems, setMenuItems] = useState([]) + + useEffect(() => { + axios.get('/api/horizontal-nav/data').then(response => { + const menuArray = response.data + + setMenuItems(menuArray) + }) + }, []) + + return { menuItems } +} + +export default ServerSideNavItems diff --git a/app/layouts/components/vertical/AppBarContent.tsx b/app/layouts/components/vertical/AppBarContent.tsx new file mode 100644 index 0000000..c0a0ae6 --- /dev/null +++ b/app/layouts/components/vertical/AppBarContent.tsx @@ -0,0 +1,45 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import IconButton from '@mui/material/IconButton' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + + +// ** Type Import +import { Settings } from 'src/@core/context/settingsContext' + +// ** Components +import ModeToggler from 'src/@core/layouts/components/shared-components/ModeToggler' +import UserDropdown from 'src/@core/layouts/components/shared-components/UserDropdown' + +interface Props { + hidden: boolean + settings: Settings + toggleNavVisibility: () => void + saveSettings: (values: Settings) => void +} + +const AppBarContent = (props: Props) => { + // ** Props + const { hidden, settings, saveSettings, toggleNavVisibility } = props + + return ( + + + {hidden ? ( + + + + ) : null} + + + + + + + + ) +} + +export default AppBarContent diff --git a/app/layouts/components/vertical/ServerSideNavItems.tsx b/app/layouts/components/vertical/ServerSideNavItems.tsx new file mode 100644 index 0000000..3551505 --- /dev/null +++ b/app/layouts/components/vertical/ServerSideNavItems.tsx @@ -0,0 +1,25 @@ +// ** React Imports +import { useEffect, useState } from 'react' + +// ** Axios Import +import axios from 'axios' + +// ** Type Import +import { VerticalNavItemsType } from 'src/@core/layouts/types' + +const ServerSideNavItems = () => { + // ** State + const [menuItems, setMenuItems] = useState([]) + + useEffect(() => { + axios.get('/api/vertical-nav/data').then(response => { + const menuArray = response.data + + setMenuItems(menuArray) + }) + }, []) + + return { menuItems } +} + +export default ServerSideNavItems diff --git a/app/login/page.tsx b/app/login/page.tsx new file mode 100644 index 0000000..328d07b --- /dev/null +++ b/app/login/page.tsx @@ -0,0 +1,356 @@ +"use client" + +// ** React Imports +import { useState, ReactNode, MouseEvent } from 'react' + +// ** Next Imports +import Link from 'next/link' + +// ** MUI Components +import Alert from '@mui/material/Alert' +import Button from '@mui/material/Button' +import Divider from '@mui/material/Divider' +import Checkbox from '@mui/material/Checkbox' +import TextField from '@mui/material/TextField' +import Typography from '@mui/material/Typography' +import InputLabel from '@mui/material/InputLabel' +import IconButton from '@mui/material/IconButton' +import Box, { BoxProps } from '@mui/material/Box' +import FormControl from '@mui/material/FormControl' +import useMediaQuery from '@mui/material/useMediaQuery' +import OutlinedInput from '@mui/material/OutlinedInput' +import { styled, useTheme } from '@mui/material/styles' +import FormHelperText from '@mui/material/FormHelperText' +import InputAdornment from '@mui/material/InputAdornment' +import MuiFormControlLabel, { FormControlLabelProps } from '@mui/material/FormControlLabel' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Third Party Imports +import * as yup from 'yup' +import { useForm, Controller } from 'react-hook-form' +import { yupResolver } from '@hookform/resolvers/yup' + +// ** Hooks +import { useAuth } from 'src/hooks/useAuth' +import useBgColor from 'src/@core/hooks/useBgColor' +import { useSettings } from 'src/@core/hooks/useSettings' + +// ** Configs +import themeConfig from 'src/configs/themeConfig' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Demo Imports +import FooterIllustrationsV2 from 'src/views/pages/auth/FooterIllustrationsV2' + +// ** Styled Components +const LoginIllustration = styled('img')(({ theme }) => ({ + zIndex: 2, + maxHeight: 680, + marginTop: theme.spacing(12), + marginBottom: theme.spacing(12), + [theme.breakpoints.down(1540)]: { + maxHeight: 550 + }, + [theme.breakpoints.down('lg')]: { + maxHeight: 500 + } +})) + +const RightWrapper = styled(Box)(({ theme }) => ({ + width: '100%', + [theme.breakpoints.up('md')]: { + maxWidth: 450 + }, + [theme.breakpoints.up('lg')]: { + maxWidth: 600 + }, + [theme.breakpoints.up('xl')]: { + maxWidth: 750 + } +})) + +const LinkStyled = styled(Link)(({ theme }) => ({ + fontSize: '0.875rem', + textDecoration: 'none', + color: theme.palette.primary.main +})) + +const FormControlLabel = styled(MuiFormControlLabel)(({ theme }) => ({ + '& .MuiFormControlLabel-label': { + fontSize: '0.875rem', + color: theme.palette.text.secondary + } +})) + +const typedSchema: yup.SchemaOf = yup.object().shape({ + email: yup.string().email().required(), + password: yup.string().min(5).required() +}); + +const defaultValues = { + password: 'admin', + email: 'admin@vuexy.com' +} + +interface FormData { + email: string; + password: string; +} + +const LoginPage = () => { + const [rememberMe, setRememberMe] = useState(true) + const [showPassword, setShowPassword] = useState(false) + + // ** Hooks + const auth = useAuth() + const theme = useTheme() + const bgColors = useBgColor() + const { settings } = useSettings() + const hidden = useMediaQuery(theme.breakpoints.down('md')) + + // ** Vars + const { skin } = settings + + + + const { + control, + setError, + handleSubmit, + formState: { errors } + } = useForm({ + defaultValues, + mode: 'onBlur', + resolver: yupResolver(typedSchema) + }); + + const onSubmit = (data: FormData) => { + const { email, password } = data + auth.login({ email, password, rememberMe }, () => { + setError('email', { + type: 'manual', + message: 'Email or Password is invalid' + }) + }) + } + + const imageSource = skin === 'bordered' ? 'auth-v2-login-illustration-bordered' : 'auth-v2-login-illustration' + + return ( + + {!hidden ? ( + theme.spacing(8, 0, 8, 8) + }} + > + + + + ) : null} + + + + + + + + + + + + {`${themeConfig.templateName}! by Productzilla `} + + + Please sign-in to your account and start the adventure + + + + + Admin: admin@vuexy.com / Pass: admin + + + Client: client@vuexy.com / Pass: client + + +
+ + ( + + )} + /> + {errors.email && {errors.email.message}} + + + + Password + + ( + + e.preventDefault()} + onClick={() => setShowPassword(!showPassword)} + > + + + + } + /> + )} + /> + {errors.password && ( + + {errors.password.message} + + )} + + + setRememberMe(e.target.checked)} />} + /> + Forgot Password? + + + + New on our platform? + + + Create an account + + + + `${theme.spacing(6)} !important` + }} + > + or + + + ) => e.preventDefault()} + > + + + ) => e.preventDefault()} + > + + + ) => e.preventDefault()} + sx={{ color: theme => (theme.palette.mode === 'light' ? '#272727' : 'grey.300') }} + > + + + ) => e.preventDefault()} + > + + + +
+
+
+
+
+ ) +} + +LoginPage.getLayout = (page: ReactNode) => {page} + +LoginPage.guestGuard = true + +export default LoginPage diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index 5705d4e..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import Image from "next/image"; - -export default function Home() { - return ( -
-
-

- Get started by editing  - app/page.tsx -

- -
- -
- Next.js Logo -
- - -
- ); -} diff --git a/app/register/page.tsx b/app/register/page.tsx new file mode 100644 index 0000000..2d661c3 --- /dev/null +++ b/app/register/page.tsx @@ -0,0 +1,402 @@ +"use client" + +// ** React Imports +import { ReactNode, useState, Fragment, MouseEvent } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Components +import Button from '@mui/material/Button' +import Divider from '@mui/material/Divider' +import Checkbox from '@mui/material/Checkbox' +import TextField from '@mui/material/TextField' +import Typography from '@mui/material/Typography' +import InputLabel from '@mui/material/InputLabel' +import IconButton from '@mui/material/IconButton' +import Box, { BoxProps } from '@mui/material/Box' +import FormControl from '@mui/material/FormControl' +import useMediaQuery from '@mui/material/useMediaQuery' +import OutlinedInput from '@mui/material/OutlinedInput' +import { styled, useTheme } from '@mui/material/styles' +import FormHelperText from '@mui/material/FormHelperText' +import InputAdornment from '@mui/material/InputAdornment' +import MuiFormControlLabel, { FormControlLabelProps } from '@mui/material/FormControlLabel' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Third Party Imports +import * as yup from 'yup' +import { yupResolver } from '@hookform/resolvers/yup' +import { useForm, Controller } from 'react-hook-form' + +// ** Layout Import +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Hooks +import { useAuth } from 'src/hooks/useAuth' +import { useSettings } from 'src/@core/hooks/useSettings' + +// ** Demo Imports +import FooterIllustrationsV2 from 'src/views/pages/auth/FooterIllustrationsV2' + +const defaultValues = { + email: '', + username: '', + password: '', + terms: false +} +interface FormData { + email: string + terms: boolean + username: string + password: string +} + +// ** Styled Components +const RegisterIllustration = styled('img')(({ theme }) => ({ + zIndex: 2, + maxHeight: 600, + marginTop: theme.spacing(12), + marginBottom: theme.spacing(12), + [theme.breakpoints.down(1540)]: { + maxHeight: 550 + }, + [theme.breakpoints.down('lg')]: { + maxHeight: 500 + } +})) + +const RightWrapper = styled(Box)(({ theme }) => ({ + width: '100%', + [theme.breakpoints.up('md')]: { + maxWidth: 450 + }, + [theme.breakpoints.up('lg')]: { + maxWidth: 600 + }, + [theme.breakpoints.up('xl')]: { + maxWidth: 750 + } +})) + +const LinkStyled = styled(Link)(({ theme }) => ({ + fontSize: '0.875rem', + textDecoration: 'none', + color: theme.palette.primary.main +})) + +const FormControlLabel = styled(MuiFormControlLabel)(({ theme }) => ({ + marginTop: theme.spacing(1.5), + marginBottom: theme.spacing(1.75), + '& .MuiFormControlLabel-label': { + fontSize: '0.875rem', + color: theme.palette.text.secondary + } +})) + +const Register = () => { + // ** States + const [showPassword, setShowPassword] = useState(false) + + // ** Hooks + const theme = useTheme() + const { register } = useAuth() + const { settings } = useSettings() + const hidden = useMediaQuery(theme.breakpoints.down('md')) + + // ** Vars + const { skin } = settings + + const typedSchema: yup.SchemaOf = yup.object().shape({ + email: yup.string().email().required(), + terms: yup.boolean().oneOf([true], 'You must accept the privacy policy & terms').required(), + username: yup.string().min(3).required(), + password: yup.string().min(5).required(), + }); + + + const { + control, + setError, + handleSubmit, + formState: { errors } + } = useForm({ + defaultValues, + mode: 'onBlur', + resolver: yupResolver(typedSchema) + }) + + const onSubmit = (data: FormData) => { + const { email, username, password } = data + register({ email, username, password }, err => { + if (err.email) { + setError('email', { + type: 'manual', + message: err.email + }) + } + if (err.username) { + setError('username', { + type: 'manual', + message: err.username + }) + } + }) + } + + const imageSource = skin === 'bordered' ? 'auth-v2-register-illustration-bordered' : 'auth-v2-register-illustration' + + return ( + + {!hidden ? ( + theme.spacing(8, 0, 8, 8) + }} + > + + + + ) : null} + + + + + + + + + + + + Adventure starts here 🚀 + + Make your app management easy and fun! + +
+ + ( + + )} + /> + {errors.username && ( + {errors.username.message} + )} + + + ( + + )} + /> + {errors.email && {errors.email.message}} + + + + Password + + ( + + e.preventDefault()} + onClick={() => setShowPassword(!showPassword)} + > + + + + } + /> + )} + /> + {errors.password && ( + {errors.password.message} + )} + + + + { + return ( + + } + label={ + + + I agree to{' '} + + ) => e.preventDefault()}> + privacy policy & terms + + + } + /> + ) + }} + /> + {errors.terms && ( + {errors.terms.message} + )} + + + + Already have an account? + + + Sign in instead + + + + `${theme.spacing(6)} !important` + }} + > + or + + + ) => e.preventDefault()} + > + + + ) => e.preventDefault()} + > + + + ) => e.preventDefault()} + sx={{ color: theme => (theme.palette.mode === 'light' ? '#272727' : 'grey.300') }} + > + + + ) => e.preventDefault()} + > + + + +
+
+
+
+
+ ) +} + +Register.getLayout = (page: ReactNode) => {page} + +Register.guestGuard = true + +export default Register diff --git a/app/second-page/page.tsx b/app/second-page/page.tsx new file mode 100644 index 0000000..86602bd --- /dev/null +++ b/app/second-page/page.tsx @@ -0,0 +1,28 @@ +// ** MUI Imports +import Card from '@mui/material/Card' +import Grid from '@mui/material/Grid' +import Typography from '@mui/material/Typography' +import CardHeader from '@mui/material/CardHeader' +import CardContent from '@mui/material/CardContent' + +const SecondPage = () => { + return ( + + + + + + This is your second page. + + Chocolate sesame snaps pie carrot cake pastry pie lollipop muffin. + Carrot cake dragée chupa chups jujubes. Macaroon liquorice cookie + wafer tart marzipan bonbon. Gingerbread jelly-o dragée chocolate. + + + + + + ) +} + +export default SecondPage diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs index 4678774..8378622 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,13 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + rewrites: async function () { + return [ + { + source: '/', + destination: '/home', + }, + ]; + }, +}; export default nextConfig; diff --git a/next.d.ts b/next.d.ts new file mode 100644 index 0000000..f57696a --- /dev/null +++ b/next.d.ts @@ -0,0 +1,14 @@ +import type { ACLObj } from 'src/configs/acl' +import type { ReactElement, ReactNode } from 'react' +import type { NextComponentType, NextPageContext } from 'next/dist/shared/lib/utils' + +declare module 'next' { + export declare type NextPage

= NextComponentType & { + acl?: ACLObj + authGuard?: boolean + guestGuard?: boolean + setConfig?: () => void + contentHeightFixed?: boolean + getLayout?: (page: ReactElement) => ReactNode + } +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index fbc8f43..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4827 +0,0 @@ -{ - "name": "face-ecognition-app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "face-ecognition-app", - "version": "0.1.0", - "dependencies": { - "next": "14.2.1", - "react": "^18", - "react-dom": "^18" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "eslint": "^8", - "eslint-config-next": "14.2.1", - "postcss": "^8", - "tailwindcss": "^3.4.1", - "typescript": "^5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "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", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "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" - } - }, - "node_modules/@jridgewell/set-array": { - "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" - } - }, - "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 - }, - "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" - } - }, - "node_modules/@next/env": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.1.tgz", - "integrity": "sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.1.tgz", - "integrity": "sha512-Fp+mthEBjkn8r9qd6o4JgxKp0IDEzW0VYHD8ZC05xS5/lFNwHKuOdr2kVhWG7BQCO9L6eeepshM1Wbs2T+LgSg==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.1.tgz", - "integrity": "sha512-kGjnjcIJehEcd3rT/3NAATJQndAEELk0J9GmGMXHSC75TMnvpOhONcjNHbjtcWE5HUQnIHy5JVkatrnYm1QhVw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.1.tgz", - "integrity": "sha512-dAdWndgdQi7BK2WSXrx4lae7mYcOYjbHJUhvOUnJjMNYrmYhxbbvJ2xElZpxNxdfA6zkqagIB9He2tQk+l16ew==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.1.tgz", - "integrity": "sha512-2ZctfnyFOGvTkoD6L+DtQtO3BfFz4CapoHnyLTXkOxbZkVRgg3TQBUjTD/xKrO1QWeydeo8AWfZRg8539qNKrg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.1.tgz", - "integrity": "sha512-jazZXctiaanemy4r+TPIpFP36t1mMwWCKMsmrTRVChRqE6putyAxZA4PDujx0SnfvZHosjdkx9xIq9BzBB5tWg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.1.tgz", - "integrity": "sha512-VjCHWCjsAzQAAo8lkBOLEIkBZFdfW+Z18qcQ056kL4KpUYc8o59JhLDCBlhg+hINQRgzQ2UPGma2AURGOH0+Qg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.1.tgz", - "integrity": "sha512-7HZKYKvAp4nAHiHIbY04finRqjeYvkITOGOurP1aLMexIFG/1+oCnqhGogBdc4lao/lkMW1c+AkwWSzSlLasqw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.1.tgz", - "integrity": "sha512-YGHklaJ/Cj/F0Xd8jxgj2p8po4JTCi6H7Z3Yics3xJhm9CPIqtl8erlpK1CLv+HInDqEWfXilqatF8YsLxxA2Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.1.tgz", - "integrity": "sha512-o+ISKOlvU/L43ZhtAAfCjwIfcwuZstiHVXq/BDsZwGqQE0h/81td95MPHliWCnFoikzWcYqh+hz54ZB2FIT8RA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.1.tgz", - "integrity": "sha512-GmRoTiLcvCLifujlisknv4zu9/C4i9r0ktsA8E51EMqJL4bD4CpO7lDYr7SrUxCR0tS4RVcrqKmCak24T0ohaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", - "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", - "dev": true - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" - }, - "node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.79", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", - "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.25", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", - "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "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" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.1.tgz", - "integrity": "sha512-BgD0kPCWMlqoItRf3xe9fG0MqwObKfVch+f2ccwDpZiCJA8ghkz2wrASH+bI6nLZzGcOJOpMm1v1Q1euhfpt4Q==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.2.1", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "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" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "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" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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 - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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 - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.1.tgz", - "integrity": "sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==", - "dependencies": { - "@next/env": "14.2.1", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.1", - "@next/swc-darwin-x64": "14.2.1", - "@next/swc-linux-arm64-gnu": "14.2.1", - "@next/swc-linux-arm64-musl": "14.2.1", - "@next/swc-linux-x64-gnu": "14.2.1", - "@next/swc-linux-x64-musl": "14.2.1", - "@next/swc-win32-arm64-msvc": "14.2.1", - "@next/swc-win32-ia32-msvc": "14.2.1", - "@next/swc-win32-x64-msvc": "14.2.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "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" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-type": { - "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" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "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", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "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 - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "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" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index e859340..1fe278c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "face-ecognition-app", + "name": "face-recognition-app", "version": "0.1.0", "private": true, "scripts": { @@ -9,18 +9,111 @@ "lint": "next lint" }, "dependencies": { + "@casl/ability": "6.3.3", + "@casl/react": "3.1.0", + "@emotion/cache": "11.10.5", + "@emotion/react": "11.10.5", + "@emotion/server": "11.10.0", + "@emotion/styled": "11.10.5", + "@fullcalendar/bootstrap5": "6.0.2", + "@fullcalendar/common": "5.11.3", + "@fullcalendar/core": "6.0.2", + "@fullcalendar/daygrid": "6.0.2", + "@fullcalendar/interaction": "6.0.2", + "@fullcalendar/list": "6.0.2", + "@fullcalendar/react": "6.0.2", + "@fullcalendar/timegrid": "6.0.2", + "@hookform/resolvers": "^3.3.4", + "@iconify/react": "4.0.1", + "@mui/lab": "5.0.0-alpha.115", + "@mui/material": "5.11.4", + "@mui/x-data-grid": "5.17.18", + "@popperjs/core": "2.11.6", + "@reduxjs/toolkit": "1.9.1", + "apexcharts-clevision": "3.28.5", + "axios": "1.2.2", + "axios-mock-adapter": "1.21.2", + "bootstrap-icons": "1.10.3", + "chart.js": "4.1.2", + "cleave.js": "1.6.0", + "clipboard-copy": "4.0.1", + "clsx": "1.2.1", + "date-fns": "2.29.3", + "draft-js": "0.11.7", + "i18next": "22.4.9", + "i18next-browser-languagedetector": "7.0.1", + "i18next-http-backend": "2.1.1", + "jsonwebtoken": "8.5.1", + "keen-slider": "6.8.5", + "next": "14.2.1", + "nprogress": "0.2.0", + "payment": "2.4.6", + "prismjs": "1.29.0", "react": "^18", + "react-apexcharts": "1.4.0", + "react-chartjs-2": "5.1.0", + "react-credit-cards": "0.8.3", + "react-datepicker": "4.8.0", "react-dom": "^18", - "next": "14.2.1" + "react-draft-wysiwyg": "1.15.0", + "react-dropzone": "14.2.3", + "react-hook-form": "7.41.5", + "react-hot-toast": "2.4.0", + "react-i18next": "12.1.4", + "react-perfect-scrollbar": "1.5.8", + "react-popper": "2.3.0", + "react-redux": "8.0.5", + "recharts": "2.2.0", + "stylis": "4.1.3", + "stylis-plugin-rtl": "2.1.1", + "yup": "0.32.11" }, "devDependencies": { - "typescript": "^5", + "@iconify/iconify": "3.0.1", + "@iconify/json": "2.2.4", + "@iconify/tools": "2.2.0", + "@iconify/types": "2.0.0", + "@iconify/utils": "2.0.11", + "@types/cleave.js": "1.4.7", + "@types/draft-js": "0.11.10", + "@types/jsonwebtoken": "8.5.9", "@types/node": "^20", + "@types/nprogress": "0.2.0", + "@types/payment": "2.1.4", + "@types/prismjs": "1.26.0", "@types/react": "^18", + "@types/react-credit-cards": "0.8.1", + "@types/react-datepicker": "4.8.0", "@types/react-dom": "^18", - "postcss": "^8", - "tailwindcss": "^3.4.1", + "@types/react-draft-wysiwyg": "1.13.4", + "@types/react-redux": "7.1.25", + "@typescript-eslint/eslint-plugin": "5.48.0", + "@typescript-eslint/parser": "5.48.0", "eslint": "^8", - "eslint-config-next": "14.2.1" + "eslint-config-next": "14.2.1", + "eslint-config-prettier": "8.6.0", + "eslint-import-resolver-alias": "1.1.2", + "eslint-import-resolver-typescript": "3.5.2", + "eslint-plugin-import": "2.26.0", + "postcss": "^8", + "prettier": "2.8.2", + "tailwindcss": "^3.4.1", + "typescript": "^5" + }, + "resolutions": { + "minipass": "4.0.0", + "@mui/x-data-grid/@mui/system": "5.4.1", + "react-credit-cards/prop-types": "15.7.2", + "react-hot-toast/goober/csstype": "3.0.10", + "recharts/react-smooth/prop-types": "15.6.0", + "react-draft-wysiwyg/html-to-draftjs/immutable": "4.2.2", + "react-draft-wysiwyg/draftjs-utils/immutable": "4.2.2", + "@emotion/react/@emotion/babel-plugin/@babel/core": "7.0.0", + "@emotion/react/@emotion/babel-plugin/@babel/plugin-syntax-jsx/@babel/core": "7.0.0" + }, + "overrides": { + "react-credit-cards": { + "react": "$react" + } } } diff --git a/public/images/apple-touch-icon.png b/public/images/apple-touch-icon.png new file mode 100644 index 0000000..503d5ff Binary files /dev/null and b/public/images/apple-touch-icon.png differ diff --git a/public/images/avatars/1.png b/public/images/avatars/1.png new file mode 100644 index 0000000..30b72ad Binary files /dev/null and b/public/images/avatars/1.png differ diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100644 index 0000000..8ac49c4 Binary files /dev/null and b/public/images/favicon.png differ diff --git a/public/images/pages/401.png b/public/images/pages/401.png new file mode 100644 index 0000000..51b4b64 Binary files /dev/null and b/public/images/pages/401.png differ diff --git a/public/images/pages/404.png b/public/images/pages/404.png new file mode 100644 index 0000000..13c5bfa Binary files /dev/null and b/public/images/pages/404.png differ diff --git a/public/images/pages/auth-v2-forgot-password-illustration-dark.png b/public/images/pages/auth-v2-forgot-password-illustration-dark.png new file mode 100644 index 0000000..5107b5d Binary files /dev/null and b/public/images/pages/auth-v2-forgot-password-illustration-dark.png differ diff --git a/public/images/pages/auth-v2-forgot-password-illustration-light.png b/public/images/pages/auth-v2-forgot-password-illustration-light.png new file mode 100644 index 0000000..7523de4 Binary files /dev/null and b/public/images/pages/auth-v2-forgot-password-illustration-light.png differ diff --git a/public/images/pages/auth-v2-login-illustration-bordered-dark.png b/public/images/pages/auth-v2-login-illustration-bordered-dark.png new file mode 100644 index 0000000..d349ad9 Binary files /dev/null and b/public/images/pages/auth-v2-login-illustration-bordered-dark.png differ diff --git a/public/images/pages/auth-v2-login-illustration-bordered-light.png b/public/images/pages/auth-v2-login-illustration-bordered-light.png new file mode 100644 index 0000000..e780c88 Binary files /dev/null and b/public/images/pages/auth-v2-login-illustration-bordered-light.png differ diff --git a/public/images/pages/auth-v2-login-illustration-dark.png b/public/images/pages/auth-v2-login-illustration-dark.png new file mode 100644 index 0000000..c128eb1 Binary files /dev/null and b/public/images/pages/auth-v2-login-illustration-dark.png differ diff --git a/public/images/pages/auth-v2-login-illustration-light.png b/public/images/pages/auth-v2-login-illustration-light.png new file mode 100644 index 0000000..55ed86a Binary files /dev/null and b/public/images/pages/auth-v2-login-illustration-light.png differ diff --git a/public/images/pages/auth-v2-mask-dark.png b/public/images/pages/auth-v2-mask-dark.png new file mode 100644 index 0000000..5b9eb1b Binary files /dev/null and b/public/images/pages/auth-v2-mask-dark.png differ diff --git a/public/images/pages/auth-v2-mask-light.png b/public/images/pages/auth-v2-mask-light.png new file mode 100644 index 0000000..2805247 Binary files /dev/null and b/public/images/pages/auth-v2-mask-light.png differ diff --git a/public/images/pages/auth-v2-register-illustration-bordered-dark.png b/public/images/pages/auth-v2-register-illustration-bordered-dark.png new file mode 100644 index 0000000..b116e32 Binary files /dev/null and b/public/images/pages/auth-v2-register-illustration-bordered-dark.png differ diff --git a/public/images/pages/auth-v2-register-illustration-bordered-light.png b/public/images/pages/auth-v2-register-illustration-bordered-light.png new file mode 100644 index 0000000..fe2a877 Binary files /dev/null and b/public/images/pages/auth-v2-register-illustration-bordered-light.png differ diff --git a/public/images/pages/auth-v2-register-illustration-dark.png b/public/images/pages/auth-v2-register-illustration-dark.png new file mode 100644 index 0000000..a138c82 Binary files /dev/null and b/public/images/pages/auth-v2-register-illustration-dark.png differ diff --git a/public/images/pages/auth-v2-register-illustration-light.png b/public/images/pages/auth-v2-register-illustration-light.png new file mode 100644 index 0000000..c8c0196 Binary files /dev/null and b/public/images/pages/auth-v2-register-illustration-light.png differ diff --git a/public/images/pages/misc-mask-dark.png b/public/images/pages/misc-mask-dark.png new file mode 100644 index 0000000..ba7799b Binary files /dev/null and b/public/images/pages/misc-mask-dark.png differ diff --git a/public/images/pages/misc-mask-light.png b/public/images/pages/misc-mask-light.png new file mode 100644 index 0000000..e9925bf Binary files /dev/null and b/public/images/pages/misc-mask-light.png differ diff --git a/src/@core/components/auth/AclGuard.tsx b/src/@core/components/auth/AclGuard.tsx new file mode 100644 index 0000000..aa59bfe --- /dev/null +++ b/src/@core/components/auth/AclGuard.tsx @@ -0,0 +1,62 @@ +// ** React Imports +import { ReactNode, useState } from 'react' + +// ** Next Import +import { useRouter } from 'next/router' + +// ** Types +import type { ACLObj, AppAbility } from 'src/configs/acl' + +// ** Context Imports +import { AbilityContext } from 'app/layouts/components/acl/Can' + +// ** Config Import +import { buildAbilityFor } from 'src/configs/acl' + +// ** Component Import +import NotAuthorized from 'app/401' +import BlankLayout from 'src/@core/layouts/BlankLayout' + +// ** Hooks +import { useAuth } from 'src/hooks/useAuth' + +interface AclGuardProps { + children: ReactNode + guestGuard: boolean + aclAbilities: ACLObj +} + +const AclGuard = (props: AclGuardProps) => { + // ** Props + const { aclAbilities, children, guestGuard } = props + + const [ability, setAbility] = useState(undefined) + + // ** Hooks + const auth = useAuth() + const router = useRouter() + + // If guestGuard is true and user is not logged in or its an error page, render the page without checking access + if (guestGuard || router.route === '/404' || router.route === '/500' || router.route === '/') { + return <>{children} + } + + // User is logged in, build ability for the user based on his role + if (auth.user && auth.user.role && !ability) { + setAbility(buildAbilityFor(auth.user.role, aclAbilities.subject)) + } + + // Check the access of current user and render pages + if (ability && ability.can(aclAbilities.action, aclAbilities.subject)) { + return {children} + } + + // Render Not Authorized component if the current user has limited access + return ( + + + + ) +} + +export default AclGuard diff --git a/src/@core/components/auth/AuthGuard.tsx b/src/@core/components/auth/AuthGuard.tsx new file mode 100644 index 0000000..1a3a0b6 --- /dev/null +++ b/src/@core/components/auth/AuthGuard.tsx @@ -0,0 +1,48 @@ +// ** React Imports +import { ReactNode, ReactElement, useEffect } from 'react' + +// ** Next Import +import { useRouter } from 'next/router' + +// ** Hooks Import +import { useAuth } from 'src/hooks/useAuth' + +interface AuthGuardProps { + children: ReactNode + fallback: ReactElement | null +} + +const AuthGuard = (props: AuthGuardProps) => { + const { children, fallback } = props + const auth = useAuth() + const router = useRouter() + + useEffect( + () => { + if (!router.isReady) { + return + } + + if (auth.user === null && !window.localStorage.getItem('userData')) { + if (router.asPath !== '/') { + router.replace({ + pathname: '/login', + query: { returnUrl: router.asPath } + }) + } else { + router.replace('/login') + } + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [router.route] + ) + + if (auth.loading || auth.user === null) { + return fallback + } + + return <>{children} +} + +export default AuthGuard diff --git a/src/@core/components/auth/GuestGuard.tsx b/src/@core/components/auth/GuestGuard.tsx new file mode 100644 index 0000000..56cc687 --- /dev/null +++ b/src/@core/components/auth/GuestGuard.tsx @@ -0,0 +1,38 @@ +// ** React Imports +import { ReactNode, ReactElement, useEffect } from 'react' + +// ** Next Import +import { useRouter } from 'next/router' + +// ** Hooks Import +import { useAuth } from 'src/hooks/useAuth' + +interface GuestGuardProps { + children: ReactNode + fallback: ReactElement | null +} + +const GuestGuard = (props: GuestGuardProps) => { + const { children, fallback } = props + const auth = useAuth() + const router = useRouter() + + useEffect(() => { + if (!router.isReady) { + return + } + + if (window.localStorage.getItem('userData')) { + router.replace('/') + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [router.route]) + + if (auth.loading || (!auth.loading && auth.user !== null)) { + return fallback + } + + return <>{children} +} + +export default GuestGuard diff --git a/src/@core/components/card-snippet/index.tsx b/src/@core/components/card-snippet/index.tsx new file mode 100644 index 0000000..423d31a --- /dev/null +++ b/src/@core/components/card-snippet/index.tsx @@ -0,0 +1,138 @@ +// ** React Imports +import { useState, useEffect } from 'react' + +// ** MUI Imports +import Box from '@mui/material/Box' +import Card from '@mui/material/Card' +import Tooltip from '@mui/material/Tooltip' +import Divider from '@mui/material/Divider' +import { Theme } from '@mui/material/styles' +import Collapse from '@mui/material/Collapse' +import IconButton from '@mui/material/IconButton' +import CardHeader from '@mui/material/CardHeader' +import CardContent from '@mui/material/CardContent' +import ToggleButton from '@mui/material/ToggleButton' +import useMediaQuery from '@mui/material/useMediaQuery' +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Third Party Components +import Prism from 'prismjs' +import toast from 'react-hot-toast' + +// ** Types +import { CardSnippetProps } from './types' + +// ** Hooks +import useClipboard from 'src/@core/hooks/useClipboard' + +const CardSnippet = (props: CardSnippetProps) => { + // ** Props + const { id, sx, code, title, children, className } = props + + // ** States + const [showCode, setShowCode] = useState(false) + const [tabValue, setTabValue] = useState<'tsx' | 'jsx'>(code.tsx !== null ? 'tsx' : 'jsx') + + // ** Hooks + const clipboard = useClipboard() + const hidden = useMediaQuery((theme: Theme) => theme.breakpoints.down('md')) + + // ** Highlight code on mount + useEffect(() => { + Prism.highlightAll() + }, [showCode, tabValue]) + + const codeToCopy = () => { + if (code.tsx !== null && tabValue === 'tsx') { + return code.tsx.props.children.props.children + } else if (code.jsx !== null && tabValue === 'jsx') { + return code.jsx.props.children.props.children + } else { + return '' + } + } + + const handleClick = () => { + clipboard.copy(codeToCopy()) + toast.success('The source code has been copied to your clipboard.', { + duration: 2000 + }) + } + + const renderCode = () => { + if (code[tabValue] !== null) { + return code[tabValue] + } else { + return null + } + } + + return ( + + setShowCode(!showCode)}> + + + ) + })} + /> + {children} + {hidden ? null : ( + + + + + + (newValue !== null ? setTabValue(newValue) : null)} + > + {code.tsx !== null ? ( + + + + ) : null} + {code.jsx !== null ? ( + + + + ) : null} + + + + + + + +

{renderCode()}
+ + + )} + + ) +} + +export default CardSnippet diff --git a/src/@core/components/card-snippet/types.ts b/src/@core/components/card-snippet/types.ts new file mode 100644 index 0000000..2574d8c --- /dev/null +++ b/src/@core/components/card-snippet/types.ts @@ -0,0 +1,16 @@ +// ** React Imports +import { ReactNode, ReactElement } from 'react' + +// ** ateMUI Imports +import { CardProps } from '@mui/material/Card' + +export type CardSnippetProps = CardProps & { + id?: string + title: string + children: ReactNode + code: { + tsx: ReactElement | null + jsx: ReactElement | null + } + className?: string +} diff --git a/src/@core/components/card-statistics/card-stats-horizontal-with-details/index.tsx b/src/@core/components/card-statistics/card-stats-horizontal-with-details/index.tsx new file mode 100644 index 0000000..758bc6b --- /dev/null +++ b/src/@core/components/card-statistics/card-stats-horizontal-with-details/index.tsx @@ -0,0 +1,50 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Card from '@mui/material/Card' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +// ** Type Import +import { CardStatsHorizontalWithDetailsProps } from 'src/@core/components/card-statistics/types' + +// ** Custom Component Import +import Icon from 'src/@core/components/icon' +import CustomAvatar from 'src/@core/components/mui/avatar' + +const CardStatsHorizontalWithDetails = (props: CardStatsHorizontalWithDetailsProps) => { + // ** Props + const { + sx, + icon, + stats, + title, + subtitle, + trendDiff, + iconSize = 24, + avatarSize = 38, + trend = 'positive', + avatarColor = 'primary' + } = props + + return ( + + + + {title} + + {stats} + {`(${trendDiff})%`} + + {subtitle} + + + + + + + ) +} + +export default CardStatsHorizontalWithDetails diff --git a/src/@core/components/card-statistics/card-stats-horizontal/index.tsx b/src/@core/components/card-statistics/card-stats-horizontal/index.tsx new file mode 100644 index 0000000..99569f6 --- /dev/null +++ b/src/@core/components/card-statistics/card-stats-horizontal/index.tsx @@ -0,0 +1,33 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Card from '@mui/material/Card' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +// ** Type Import +import { CardStatsHorizontalProps } from 'src/@core/components/card-statistics/types' + +// ** Custom Component Import +import Icon from 'src/@core/components/icon' +import CustomAvatar from 'src/@core/components/mui/avatar' + +const CardStatsHorizontal = (props: CardStatsHorizontalProps) => { + // ** Props + const { sx, icon, stats, title, iconSize = 24, avatarSize = 42, avatarColor = 'primary' } = props + + return ( + + + + {stats} + {title} + + + + + + + ) +} + +export default CardStatsHorizontal diff --git a/src/@core/components/card-statistics/card-stats-square/index.tsx b/src/@core/components/card-statistics/card-stats-square/index.tsx new file mode 100644 index 0000000..4e8316e --- /dev/null +++ b/src/@core/components/card-statistics/card-stats-square/index.tsx @@ -0,0 +1,32 @@ +// ** MUI Imports +import Card from '@mui/material/Card' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +// ** Type Import +import { CardStatsSquareProps } from 'src/@core/components/card-statistics/types' + +// ** Custom Component Import +import Icon from 'src/@core/components/icon' +import CustomAvatar from 'src/@core/components/mui/avatar' + +const CardStatsSquare = (props: CardStatsSquareProps) => { + // ** Props + const { sx, icon, stats, title, iconSize = 24, avatarSize = 42, avatarColor = 'primary' } = props + + return ( + + + + + + + {stats} + + {title} + + + ) +} + +export default CardStatsSquare diff --git a/src/@core/components/card-statistics/card-stats-vertical/index.tsx b/src/@core/components/card-statistics/card-stats-vertical/index.tsx new file mode 100644 index 0000000..af6bb06 --- /dev/null +++ b/src/@core/components/card-statistics/card-stats-vertical/index.tsx @@ -0,0 +1,63 @@ +// ** MUI Imports +import Card from '@mui/material/Card' +import Chip from '@mui/material/Chip' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +// ** Type Import +import { CardStatsVerticalProps } from 'src/@core/components/card-statistics/types' + +// ** Custom Component Import +import Icon from 'src/@core/components/icon' +import CustomChip from 'src/@core/components/mui/chip' +import CustomAvatar from 'src/@core/components/mui/avatar' + +const CardStatsVertical = (props: CardStatsVerticalProps) => { + // ** Props + const { + sx, + stats, + title, + chipText, + subtitle, + avatarIcon, + iconSize = 24, + avatarSize = 42, + chipColor = 'primary', + avatarColor = 'primary' + } = props + + const RenderChip = chipColor === 'default' ? Chip : CustomChip + + return ( + + + + + + + {title} + + + {subtitle} + + {stats} + + + + ) +} + +export default CardStatsVertical diff --git a/src/@core/components/card-statistics/card-stats-with-area-chart/index.tsx b/src/@core/components/card-statistics/card-stats-with-area-chart/index.tsx new file mode 100644 index 0000000..a56dbb1 --- /dev/null +++ b/src/@core/components/card-statistics/card-stats-with-area-chart/index.tsx @@ -0,0 +1,105 @@ +// ** MUI Imports +import Card from '@mui/material/Card' +import { useTheme } from '@mui/material/styles' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' + +// ** Type Imports +import { ApexOptions } from 'apexcharts' +import { CardStatsWithAreaChartProps } from 'src/@core/components/card-statistics/types' + +// ** Custom Component Imports +import Icon from 'src/@core/components/icon' +import CustomAvatar from 'src/@core/components/mui/avatar' +import ReactApexcharts from 'src/@core/components/react-apexcharts' + +const CardStatsWithAreaChart = (props: CardStatsWithAreaChartProps) => { + // ** Props + const { + sx, + stats, + title, + avatarIcon, + chartSeries, + avatarSize = 42, + avatarIconSize = 26, + chartColor = 'primary', + avatarColor = 'primary' + } = props + + // ** Hook + const theme = useTheme() + + const options: ApexOptions = { + chart: { + parentHeightOffset: 0, + toolbar: { show: false }, + sparkline: { enabled: true } + }, + tooltip: { enabled: false }, + dataLabels: { enabled: false }, + stroke: { + width: 2.5, + curve: 'smooth' + }, + grid: { + show: false, + padding: { + top: 2, + bottom: 17 + } + }, + fill: { + type: 'gradient', + gradient: { + opacityTo: 0, + opacityFrom: 1, + shadeIntensity: 1, + stops: [0, 100], + colorStops: [ + [ + { + offset: 0, + opacity: 0.4, + color: theme.palette[chartColor].main + }, + { + offset: 100, + opacity: 0.1, + color: theme.palette.background.paper + } + ] + ] + } + }, + theme: { + monochrome: { + enabled: true, + shadeTo: 'light', + shadeIntensity: 1, + color: theme.palette[chartColor].main + } + }, + xaxis: { + labels: { show: false }, + axisTicks: { show: false }, + axisBorder: { show: false } + }, + yaxis: { show: false } + } + + return ( + + + + + + {stats} + {title} + + + + ) +} + +export default CardStatsWithAreaChart diff --git a/src/@core/components/card-statistics/types.ts b/src/@core/components/card-statistics/types.ts new file mode 100644 index 0000000..1c6c608 --- /dev/null +++ b/src/@core/components/card-statistics/types.ts @@ -0,0 +1,63 @@ +// ** Types +import { ApexOptions } from 'apexcharts' +import { ChipProps } from '@mui/material/Chip' +import { SxProps, Theme } from '@mui/material' +import { ThemeColor } from 'src/@core/layouts/types' + +export type CardStatsSquareProps = { + icon: string + stats: string + title: string + sx?: SxProps + avatarSize?: number + avatarColor?: ThemeColor + iconSize?: number | string +} + +export type CardStatsHorizontalProps = { + icon: string + stats: string + title: string + sx?: SxProps + avatarSize?: number + avatarColor?: ThemeColor + iconSize?: number | string +} + +export type CardStatsWithAreaChartProps = { + stats: string + title: string + avatarIcon: string + sx?: SxProps + avatarSize?: number + chartColor?: ThemeColor + avatarColor?: ThemeColor + avatarIconSize?: number | string + chartSeries: ApexOptions['series'] +} + +export type CardStatsVerticalProps = { + stats: string + title: string + chipText: string + subtitle: string + avatarIcon: string + sx?: SxProps + avatarSize?: number + avatarColor?: ThemeColor + iconSize?: number | string + chipColor?: ChipProps['color'] +} + +export type CardStatsHorizontalWithDetailsProps = { + icon: string + stats: string + title: string + subtitle: string + trendDiff: string + sx?: SxProps + avatarSize?: number + avatarColor?: ThemeColor + iconSize?: number | string + trend?: 'positive' | 'negative' +} diff --git a/src/@core/components/custom-checkbox/basic/index.tsx b/src/@core/components/custom-checkbox/basic/index.tsx new file mode 100644 index 0000000..52deb98 --- /dev/null +++ b/src/@core/components/custom-checkbox/basic/index.tsx @@ -0,0 +1,94 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Checkbox from '@mui/material/Checkbox' +import Typography from '@mui/material/Typography' + +// ** Type Imports +import { CustomCheckboxBasicProps } from 'src/@core/components/custom-checkbox/types' + +const CustomCheckbox = (props: CustomCheckboxBasicProps) => { + // ** Props + const { data, name, selected, gridProps, handleChange, color = 'primary' } = props + + const { meta, title, value, content } = data + + const renderData = () => { + if (meta && title && content) { + return ( + + + {typeof title === 'string' ? {title} : title} + {typeof meta === 'string' ? {meta} : meta} + + {typeof content === 'string' ? {content} : content} + + ) + } else if (meta && title && !content) { + return ( + + {typeof title === 'string' ? {title} : title} + {typeof meta === 'string' ? {meta} : meta} + + ) + } else if (!meta && title && content) { + return ( + + {typeof title === 'string' ? {title} : title} + {typeof content === 'string' ? {content} : content} + + ) + } else if (!meta && !title && content) { + return typeof content === 'string' ? {content} : content + } else if (!meta && title && !content) { + return typeof title === 'string' ? {title} : title + } else { + return null + } + } + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + p: 4, + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + position: 'relative', + alignItems: 'flex-start', + border: theme => `1px solid ${theme.palette.divider}`, + ...(selected.includes(value) + ? { borderColor: `${color}.main` } + : { '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` } }) + }} + > + handleChange(value)} + /> + {renderData()} + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomCheckbox diff --git a/src/@core/components/custom-checkbox/icons/index.tsx b/src/@core/components/custom-checkbox/icons/index.tsx new file mode 100644 index 0000000..5158e00 --- /dev/null +++ b/src/@core/components/custom-checkbox/icons/index.tsx @@ -0,0 +1,72 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Checkbox from '@mui/material/Checkbox' +import Typography from '@mui/material/Typography' + +// ** Type Imports +import { CustomCheckboxIconsProps } from 'src/@core/components/custom-checkbox/types' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +const CustomCheckboxIcons = (props: CustomCheckboxIconsProps) => { + // ** Props + const { data, icon, name, selected, gridProps, iconProps, handleChange, color = 'primary' } = props + + const { title, value, content } = data + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + p: 4, + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + position: 'relative', + alignItems: 'center', + flexDirection: 'column', + border: theme => `1px solid ${theme.palette.divider}`, + ...(selected.includes(value) + ? { borderColor: `${color}.main`, '& svg': { color: 'primary.main' } } + : { '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` } }) + }} + > + {icon ? : null} + {title ? ( + typeof title === 'string' ? ( + {title} + ) : ( + title + ) + ) : null} + {content ? ( + typeof content === 'string' ? ( + + {content} + + ) : ( + content + ) + ) : null} + handleChange(value)} + sx={{ mb: -2, ...(!icon && !title && !content && { mt: -2 }) }} + /> + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomCheckboxIcons diff --git a/src/@core/components/custom-checkbox/image/index.tsx b/src/@core/components/custom-checkbox/image/index.tsx new file mode 100644 index 0000000..4f7b4b4 --- /dev/null +++ b/src/@core/components/custom-checkbox/image/index.tsx @@ -0,0 +1,63 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Checkbox from '@mui/material/Checkbox' + +// ** Type Imports +import { CustomCheckboxImgProps } from 'src/@core/components/custom-checkbox/types' + +const CustomCheckboxImg = (props: CustomCheckboxImgProps) => { + // ** Props + const { data, name, selected, gridProps, handleChange, color = 'primary' } = props + + const { alt, img, value } = data + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + overflow: 'hidden', + position: 'relative', + alignItems: 'center', + flexDirection: 'column', + justifyContent: 'center', + border: theme => `2px solid ${theme.palette.divider}`, + '& img': { + width: '100%', + height: '100%', + objectFit: 'cover' + }, + ...(selected.includes(value) + ? { borderColor: `${color}.main` } + : { + '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` }, + '&:not(:hover)': { + '& .MuiCheckbox-root': { display: 'none' } + } + }) + }} + > + {typeof img === 'string' ? {alt : img} + handleChange(value)} + sx={{ top: 4, right: 4, position: 'absolute' }} + /> + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomCheckboxImg diff --git a/src/@core/components/custom-checkbox/types.ts b/src/@core/components/custom-checkbox/types.ts new file mode 100644 index 0000000..d6bffd7 --- /dev/null +++ b/src/@core/components/custom-checkbox/types.ts @@ -0,0 +1,71 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** MUI Imports +import { GridProps } from '@mui/material/Grid' + +// ** Type Imports +import { IconProps } from '@iconify/react' +import { ThemeColor } from 'src/@core/layouts/types' + +// ** Types of Basic Custom Checkboxes +export type CustomCheckboxBasicData = { + value: string + content?: ReactNode + isSelected?: boolean +} & ( + | { + meta: ReactNode + title: ReactNode + } + | { + meta?: never + title?: never + } + | { + title: ReactNode + meta?: never + } +) +export type CustomCheckboxBasicProps = { + name: string + color?: ThemeColor + selected: string[] + gridProps: GridProps + data: CustomCheckboxBasicData + handleChange: (value: string) => void +} + +// ** Types of Custom Checkboxes with Icons +export type CustomCheckboxIconsData = { + value: string + title?: ReactNode + content?: ReactNode + isSelected?: boolean +} +export type CustomCheckboxIconsProps = { + name: string + icon?: string + color?: ThemeColor + selected: string[] + gridProps: GridProps + data: CustomCheckboxIconsData + iconProps?: Omit + handleChange: (value: string) => void +} + +// ** Types of Custom Checkboxes with Images +export type CustomCheckboxImgData = { + alt?: string + value: string + img: ReactNode + isSelected?: boolean +} +export type CustomCheckboxImgProps = { + name: string + color?: ThemeColor + selected: string[] + gridProps: GridProps + data: CustomCheckboxImgData + handleChange: (value: string) => void +} diff --git a/src/@core/components/custom-radio/basic/index.tsx b/src/@core/components/custom-radio/basic/index.tsx new file mode 100644 index 0000000..9720510 --- /dev/null +++ b/src/@core/components/custom-radio/basic/index.tsx @@ -0,0 +1,95 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Radio from '@mui/material/Radio' +import Typography from '@mui/material/Typography' + +// ** Type Imports +import { CustomRadioBasicProps } from 'src/@core/components/custom-radio/types' + +const CustomRadioBasic = (props: CustomRadioBasicProps) => { + // ** Props + const { name, data, selected, gridProps, handleChange, color = 'primary' } = props + + const { meta, title, value, content } = data + + const renderData = () => { + if (meta && title && content) { + return ( + + + {typeof title === 'string' ? {title} : title} + {typeof meta === 'string' ? {meta} : meta} + + {typeof content === 'string' ? {content} : content} + + ) + } else if (meta && title && !content) { + return ( + + {typeof title === 'string' ? {title} : title} + {typeof meta === 'string' ? {meta} : meta} + + ) + } else if (!meta && title && content) { + return ( + + {typeof title === 'string' ? {title} : title} + {typeof content === 'string' ? {content} : content} + + ) + } else if (!meta && !title && content) { + return typeof content === 'string' ? {content} : content + } else if (!meta && title && !content) { + return typeof title === 'string' ? {title} : title + } else { + return null + } + } + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + p: 4, + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + position: 'relative', + alignItems: 'flex-start', + border: theme => `1px solid ${theme.palette.divider}`, + ...(selected === value + ? { borderColor: `${color}.main` } + : { '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` } }) + }} + > + + {renderData()} + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomRadioBasic diff --git a/src/@core/components/custom-radio/icons/index.tsx b/src/@core/components/custom-radio/icons/index.tsx new file mode 100644 index 0000000..7e5fb63 --- /dev/null +++ b/src/@core/components/custom-radio/icons/index.tsx @@ -0,0 +1,73 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Radio from '@mui/material/Radio' +import Typography from '@mui/material/Typography' + +// ** Type Imports +import { CustomRadioIconsProps } from 'src/@core/components/custom-radio/types' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +const CustomRadioIcons = (props: CustomRadioIconsProps) => { + // ** Props + const { data, icon, name, selected, gridProps, iconProps, handleChange, color = 'primary' } = props + + const { title, value, content } = data + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + p: 4, + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + position: 'relative', + alignItems: 'center', + flexDirection: 'column', + border: theme => `1px solid ${theme.palette.divider}`, + ...(selected === value + ? { borderColor: `${color}.main`, '& svg': { color: 'primary.main' } } + : { '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` } }) + }} + > + {icon ? : null} + {title ? ( + typeof title === 'string' ? ( + {title} + ) : ( + title + ) + ) : null} + {content ? ( + typeof content === 'string' ? ( + + {content} + + ) : ( + content + ) + ) : null} + + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomRadioIcons diff --git a/src/@core/components/custom-radio/image/index.tsx b/src/@core/components/custom-radio/image/index.tsx new file mode 100644 index 0000000..fc2ae0a --- /dev/null +++ b/src/@core/components/custom-radio/image/index.tsx @@ -0,0 +1,58 @@ +// ** MUI Imports +import Box from '@mui/material/Box' +import Grid from '@mui/material/Grid' +import Radio from '@mui/material/Radio' + +// ** Type Imports +import { CustomRadioImgProps } from 'src/@core/components/custom-radio/types' + +const CustomRadioImg = (props: CustomRadioImgProps) => { + // ** Props + const { name, data, selected, gridProps, handleChange, color = 'primary' } = props + + const { alt, img, value } = data + + const renderComponent = () => { + return ( + + handleChange(value)} + sx={{ + height: '100%', + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + overflow: 'hidden', + position: 'relative', + alignItems: 'center', + flexDirection: 'column', + justifyContent: 'center', + border: theme => `2px solid ${theme.palette.divider}`, + ...(selected === value + ? { borderColor: `${color}.main` } + : { '&:hover': { borderColor: theme => `rgba(${theme.palette.customColors.main}, 0.25)` } }), + '& img': { + width: '100%', + height: '100%', + objectFit: 'cover' + } + }} + > + {typeof img === 'string' ? {alt : img} + + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomRadioImg diff --git a/src/@core/components/custom-radio/types.ts b/src/@core/components/custom-radio/types.ts new file mode 100644 index 0000000..77c2b61 --- /dev/null +++ b/src/@core/components/custom-radio/types.ts @@ -0,0 +1,71 @@ +// ** React Imports +import { ChangeEvent, ReactNode } from 'react' + +// ** MUI Imports +import { GridProps } from '@mui/material/Grid' + +// ** Type Imports +import { IconProps } from '@iconify/react' +import { ThemeColor } from 'src/@core/layouts/types' + +// ** Types of Basic Custom Radios +export type CustomRadioBasicData = { + value: string + content?: ReactNode + isSelected?: boolean +} & ( + | { + meta: ReactNode + title: ReactNode + } + | { + meta?: never + title?: never + } + | { + title: ReactNode + meta?: never + } +) +export type CustomRadioBasicProps = { + name: string + selected: string + color?: ThemeColor + gridProps: GridProps + data: CustomRadioBasicData + handleChange: (prop: string | ChangeEvent) => void +} + +// ** Types of Custom Radios with Icons +export type CustomRadioIconsData = { + value: string + title?: ReactNode + content?: ReactNode + isSelected?: boolean +} +export type CustomRadioIconsProps = { + name: string + icon?: string + selected: string + color?: ThemeColor + gridProps: GridProps + data: CustomRadioIconsData + iconProps?: Omit + handleChange: (prop: string | ChangeEvent) => void +} + +// ** Types of Custom Radios with Images +export type CustomRadioImgData = { + alt?: string + value: string + img: ReactNode + isSelected?: boolean +} +export type CustomRadioImgProps = { + name: string + selected: string + color?: ThemeColor + gridProps: GridProps + data: CustomRadioImgData + handleChange: (prop: string | ChangeEvent) => void +} diff --git a/src/@core/components/customizer/index.tsx b/src/@core/components/customizer/index.tsx new file mode 100644 index 0000000..0c851f5 --- /dev/null +++ b/src/@core/components/customizer/index.tsx @@ -0,0 +1,401 @@ +// ** React Imports +import { useState } from 'react' + +// ** Third Party Components +import PerfectScrollbar from 'react-perfect-scrollbar' + +// ** MUI Imports +import Radio from '@mui/material/Radio' +import Switch from '@mui/material/Switch' +import Divider from '@mui/material/Divider' +import { styled } from '@mui/material/styles' +import IconButton from '@mui/material/IconButton' +import RadioGroup from '@mui/material/RadioGroup' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' +import FormControlLabel from '@mui/material/FormControlLabel' +import MuiDrawer, { DrawerProps } from '@mui/material/Drawer' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Type Import +import { Settings } from 'src/@core/context/settingsContext' + +// ** Hook Import +import { useSettings } from 'src/@core/hooks/useSettings' + +const Toggler = styled(Box)(({ theme }) => ({ + right: 0, + top: '50%', + display: 'flex', + cursor: 'pointer', + position: 'fixed', + padding: theme.spacing(2), + zIndex: theme.zIndex.modal, + transform: 'translateY(-50%)', + color: theme.palette.common.white, + backgroundColor: theme.palette.primary.main, + borderTopLeftRadius: theme.shape.borderRadius, + borderBottomLeftRadius: theme.shape.borderRadius +})) + +const Drawer = styled(MuiDrawer)(({ theme }) => ({ + width: 400, + zIndex: theme.zIndex.modal, + '& .MuiFormControlLabel-root': { + marginRight: '0.6875rem' + }, + '& .MuiDrawer-paper': { + border: 0, + width: 400, + zIndex: theme.zIndex.modal, + boxShadow: theme.shadows[9] + } +})) + +const CustomizerSpacing = styled('div')(({ theme }) => ({ + padding: theme.spacing(5, 6) +})) + +const ColorBox = styled(Box)(({ theme }) => ({ + width: 45, + height: 45, + cursor: 'pointer', + margin: theme.spacing(2.5, 1.75, 1.75), + borderRadius: theme.shape.borderRadius, + transition: 'margin .25s ease-in-out, width .25s ease-in-out, height .25s ease-in-out, box-shadow .25s ease-in-out', + '&:hover': { + boxShadow: theme.shadows[4] + } +})) + +const Customizer = () => { + // ** State + const [open, setOpen] = useState(false) + + // ** Hook + const { settings, saveSettings } = useSettings() + + // ** Vars + const { + mode, + skin, + appBar, + footer, + layout, + navHidden, + direction, + appBarBlur, + themeColor, + navCollapsed, + contentWidth, + verticalNavToggleType + } = settings + + const handleChange = (field: keyof Settings, value: Settings[keyof Settings]): void => { + saveSettings({ ...settings, [field]: value }) + } + + return ( +
+ setOpen(true)}> + + + + theme.spacing(3.5, 5), + borderBottom: theme => `1px solid ${theme.palette.divider}` + }} + > + + Theme Customizer + + Customize & Preview in Real Time + setOpen(false)} + sx={{ + right: 20, + top: '50%', + position: 'absolute', + color: 'text.secondary', + transform: 'translateY(-50%)' + }} + > + + + + + + + Theming + + + {/* Skin */} + + Skin + handleChange('skin', e.target.value as Settings['skin'])} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + + + + {/* Mode */} + + Mode + handleChange('mode', e.target.value as any)} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + {layout === 'horizontal' ? null : ( + } /> + )} + + + + {/* Color Picker */} +
+ Primary Color + + handleChange('themeColor', 'primary')} + sx={{ + backgroundColor: '#7367F0', + ...(themeColor === 'primary' + ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } + : {}) + }} + /> + handleChange('themeColor', 'secondary')} + sx={{ + backgroundColor: 'secondary.main', + ...(themeColor === 'secondary' + ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } + : {}) + }} + /> + handleChange('themeColor', 'success')} + sx={{ + backgroundColor: 'success.main', + ...(themeColor === 'success' + ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } + : {}) + }} + /> + handleChange('themeColor', 'error')} + sx={{ + backgroundColor: 'error.main', + ...(themeColor === 'error' + ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } + : {}) + }} + /> + handleChange('themeColor', 'warning')} + sx={{ + backgroundColor: 'warning.main', + ...(themeColor === 'warning' + ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } + : {}) + }} + /> + handleChange('themeColor', 'info')} + sx={{ + backgroundColor: 'info.main', + ...(themeColor === 'info' ? { width: 53, height: 53, m: theme => theme.spacing(1.5, 0.75, 0) } : {}) + }} + /> + +
+
+ + + + + + Layout + + + {/* Content Width */} + + Content Width + handleChange('contentWidth', e.target.value as Settings['contentWidth'])} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + + + + {/* AppBar */} + + AppBar Type + handleChange('appBar', e.target.value as Settings['appBar'])} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + {layout === 'horizontal' ? null : ( + } /> + )} + + + + {/* Footer */} + + Footer Type + handleChange('footer', e.target.value as Settings['footer'])} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + } /> + + + + {/* AppBar Blur */} + + AppBar Blur + handleChange('appBarBlur', e.target.checked)} + /> + + + + + + + + Menu + + + {/* Menu Layout */} + + Menu Layout + { + saveSettings({ + ...settings, + layout: e.target.value as Settings['layout'], + lastLayout: e.target.value as Settings['lastLayout'] + }) + }} + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + + + + {/* Menu Toggle */} + {navHidden || layout === 'horizontal' ? null : ( + + Menu Toggle + + handleChange('verticalNavToggleType', e.target.value as Settings['verticalNavToggleType']) + } + sx={{ '& .MuiFormControlLabel-label': { fontSize: '.875rem', color: 'text.secondary' } }} + > + } /> + } /> + + + )} + + {/* Menu Collapsed */} + {navHidden || layout === 'horizontal' ? null : ( + + Menu Collapsed + handleChange('navCollapsed', e.target.checked)} + /> + + )} + + {/* Menu Hidden */} + {layout === 'horizontal' && appBar === 'hidden' ? null : ( + + Menu Hidden + handleChange('navHidden', e.target.checked)} + /> + + )} + + + + + + + Misc + + + {/* RTL */} + + RTL + handleChange('direction', e.target.checked ? 'rtl' : 'ltr')} + /> + + +
+
+
+ ) +} + +export default Customizer diff --git a/src/@core/components/icon/index.tsx b/src/@core/components/icon/index.tsx new file mode 100644 index 0000000..2e549ea --- /dev/null +++ b/src/@core/components/icon/index.tsx @@ -0,0 +1,8 @@ +// ** Icon Imports +import { Icon, IconProps } from '@iconify/react' + +const IconifyIcon = ({ icon, ...rest }: IconProps) => { + return +} + +export default IconifyIcon diff --git a/src/@core/components/mui/avatar/index.tsx b/src/@core/components/mui/avatar/index.tsx new file mode 100644 index 0000000..25779c8 --- /dev/null +++ b/src/@core/components/mui/avatar/index.tsx @@ -0,0 +1,59 @@ +// ** React Imports +import { forwardRef, Ref } from 'react' + +// ** MUI Imports +import MuiAvatar from '@mui/material/Avatar' +import { lighten, useTheme } from '@mui/material/styles' + +// ** Types +import { CustomAvatarProps } from './types' +import { ThemeColor } from 'src/@core/layouts/types' + +// ** Hooks Imports +import useBgColor, { UseBgColorType } from 'src/@core/hooks/useBgColor' + +const Avatar = forwardRef((props: CustomAvatarProps, ref: Ref) => { + // ** Props + const { sx, src, skin, color } = props + + // ** Hook + const theme = useTheme() + const bgColors: UseBgColorType = useBgColor() + + const getAvatarStyles = (skin: 'filled' | 'light' | 'light-static' | undefined, skinColor: ThemeColor) => { + let avatarStyles + + if (skin === 'light') { + avatarStyles = { ...bgColors[`${skinColor}Light`] } + } else if (skin === 'light-static') { + avatarStyles = { + color: bgColors[`${skinColor}Light`].color, + backgroundColor: lighten(theme.palette[skinColor].main, 0.88) + } + } else { + avatarStyles = { ...bgColors[`${skinColor}Filled`] } + } + + return avatarStyles + } + + const colors: UseBgColorType = { + primary: getAvatarStyles(skin, 'primary'), + secondary: getAvatarStyles(skin, 'secondary'), + success: getAvatarStyles(skin, 'success'), + error: getAvatarStyles(skin, 'error'), + warning: getAvatarStyles(skin, 'warning'), + info: getAvatarStyles(skin, 'info') + } + + return +}) + +Avatar.displayName = 'Avatar'; + +Avatar.defaultProps = { + skin: 'filled', + color: 'primary' +} + +export default Avatar diff --git a/src/@core/components/mui/avatar/types.ts b/src/@core/components/mui/avatar/types.ts new file mode 100644 index 0000000..b1780da --- /dev/null +++ b/src/@core/components/mui/avatar/types.ts @@ -0,0 +1,10 @@ +// ** MUI Imports +import { AvatarProps } from '@mui/material/Avatar' + +// ** Types +import { ThemeColor } from 'src/@core/layouts/types' + +export type CustomAvatarProps = AvatarProps & { + color?: ThemeColor + skin?: 'filled' | 'light' | 'light-static' +} diff --git a/src/@core/components/mui/badge/index.tsx b/src/@core/components/mui/badge/index.tsx new file mode 100644 index 0000000..865abcf --- /dev/null +++ b/src/@core/components/mui/badge/index.tsx @@ -0,0 +1,34 @@ +// ** MUI Imports +import MuiBadge from '@mui/material/Badge' + +// ** Types +import { CustomBadgeProps } from './types' + +// ** Hooks Imports +import useBgColor, { UseBgColorType } from 'src/@core/hooks/useBgColor' + +const Badge = (props: CustomBadgeProps) => { + // ** Props + const { sx, skin, color } = props + + // ** Hook + const bgColors = useBgColor() + + const colors: UseBgColorType = { + primary: { ...bgColors.primaryLight }, + secondary: { ...bgColors.secondaryLight }, + success: { ...bgColors.successLight }, + error: { ...bgColors.errorLight }, + warning: { ...bgColors.warningLight }, + info: { ...bgColors.infoLight } + } + + return ( + + ) +} + +export default Badge diff --git a/src/@core/components/mui/badge/types.ts b/src/@core/components/mui/badge/types.ts new file mode 100644 index 0000000..bd0e659 --- /dev/null +++ b/src/@core/components/mui/badge/types.ts @@ -0,0 +1,4 @@ +// ** MUI Imports +import { BadgeProps } from '@mui/material/Badge' + +export type CustomBadgeProps = BadgeProps & { skin?: 'light' } diff --git a/src/@core/components/mui/chip/index.tsx b/src/@core/components/mui/chip/index.tsx new file mode 100644 index 0000000..270b8c0 --- /dev/null +++ b/src/@core/components/mui/chip/index.tsx @@ -0,0 +1,46 @@ +// ** MUI Imports +import MuiChip from '@mui/material/Chip' + +// ** Third Party Imports +import clsx from 'clsx' + +// ** Types +import { CustomChipProps } from './types' + +// ** Hooks Imports +import useBgColor, { UseBgColorType } from 'src/@core/hooks/useBgColor' + +const Chip = (props: CustomChipProps) => { + // ** Props + const { sx, skin, color, rounded } = props + + // ** Hook + const bgColors = useBgColor() + + const colors: UseBgColorType = { + primary: { ...bgColors.primaryLight }, + secondary: { ...bgColors.secondaryLight }, + success: { ...bgColors.successLight }, + error: { ...bgColors.errorLight }, + warning: { ...bgColors.warningLight }, + info: { ...bgColors.infoLight } + } + + const propsToPass = { ...props } + + propsToPass.rounded = undefined + + return ( + + ) +} + +export default Chip diff --git a/src/@core/components/mui/chip/types.ts b/src/@core/components/mui/chip/types.ts new file mode 100644 index 0000000..c5ce424 --- /dev/null +++ b/src/@core/components/mui/chip/types.ts @@ -0,0 +1,4 @@ +// ** MUI Imports +import { ChipProps } from '@mui/material/Chip' + +export type CustomChipProps = ChipProps & { skin?: 'light'; rounded?: boolean } diff --git a/src/@core/components/mui/timeline-dot/index.tsx b/src/@core/components/mui/timeline-dot/index.tsx new file mode 100644 index 0000000..0bd5dc5 --- /dev/null +++ b/src/@core/components/mui/timeline-dot/index.tsx @@ -0,0 +1,73 @@ +// ** MUI Imports +import { useTheme } from '@mui/material/styles' +import MuiTimelineDot from '@mui/lab/TimelineDot' + +// ** Hooks Imports +import useBgColor, { UseBgColorType } from 'src/@core/hooks/useBgColor' + +// ** Util Import +import { hexToRGBA } from 'src/@core/utils/hex-to-rgba' + +// ** Types +import { CustomTimelineDotProps, ColorsType } from './types' + +const TimelineDot = (props: CustomTimelineDotProps) => { + // ** Props + const { sx, skin, color, variant } = props + + // ** Hook + const theme = useTheme() + const bgColors: UseBgColorType = useBgColor() + + const colors: ColorsType = { + primary: { + boxShadow: 'none', + color: theme.palette.primary.main, + backgroundColor: bgColors.primaryLight.backgroundColor + }, + secondary: { + boxShadow: 'none', + color: theme.palette.secondary.main, + backgroundColor: bgColors.secondaryLight.backgroundColor + }, + success: { + boxShadow: 'none', + color: theme.palette.success.main, + backgroundColor: bgColors.successLight.backgroundColor + }, + error: { + boxShadow: 'none', + color: theme.palette.error.main, + backgroundColor: bgColors.errorLight.backgroundColor + }, + warning: { + boxShadow: 'none', + color: theme.palette.warning.main, + backgroundColor: bgColors.warningLight.backgroundColor + }, + info: { + boxShadow: 'none', + color: theme.palette.info.main, + backgroundColor: bgColors.infoLight.backgroundColor + }, + grey: { + boxShadow: 'none', + color: theme.palette.grey[500], + backgroundColor: hexToRGBA(theme.palette.grey[500], 0.12) + } + } + + return ( + + ) +} + +TimelineDot.defaultProps = { + color: 'grey', + variant: 'filled' +} + +export default TimelineDot diff --git a/src/@core/components/mui/timeline-dot/types.ts b/src/@core/components/mui/timeline-dot/types.ts new file mode 100644 index 0000000..34c5637 --- /dev/null +++ b/src/@core/components/mui/timeline-dot/types.ts @@ -0,0 +1,12 @@ +// ** MUI Imports +import { TimelineDotProps } from '@mui/lab/TimelineDot' + +export type CustomTimelineDotProps = TimelineDotProps & { skin?: 'light' } + +export type ColorsType = { + [key: string]: { + color: string + boxShadow: string + backgroundColor: string + } +} diff --git a/src/@core/components/option-menu/index.tsx b/src/@core/components/option-menu/index.tsx new file mode 100644 index 0000000..ba8c5a1 --- /dev/null +++ b/src/@core/components/option-menu/index.tsx @@ -0,0 +1,116 @@ +// ** React Imports +import { MouseEvent, useState, ReactNode } from 'react' + +// ** Next Import +import Link from 'next/link' + +// ** MUI Imports +import Box from '@mui/material/Box' +import Menu from '@mui/material/Menu' +import Divider from '@mui/material/Divider' +import MenuItem from '@mui/material/MenuItem' +import IconButton from '@mui/material/IconButton' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Type Imports +import { OptionType, OptionsMenuType, OptionMenuItemType } from './types' + +// ** Hook Import +import { useSettings } from 'src/@core/hooks/useSettings' + +const MenuItemWrapper = ({ children, option }: { children: ReactNode; option: OptionMenuItemType }) => { + if (option.href) { + return ( + + {children} + + ) + } else { + return <>{children} + } +} + +const OptionsMenu = (props: OptionsMenuType) => { + // ** Props + const { icon, options, menuProps, iconProps, leftAlignMenu, iconButtonProps } = props + + // ** State + const [anchorEl, setAnchorEl] = useState(null) + + // ** Hook & Var + const { settings } = useSettings() + const { direction } = settings + + const handleClick = (event: MouseEvent) => { + setAnchorEl(event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + return ( + <> + + {icon ? icon : } + + + {options.map((option: OptionType, index: number) => { + if (typeof option === 'string') { + return ( + + {option} + + ) + } else if ('divider' in option) { + return option.divider && + } else { + return ( + { + handleClose() + option.menuItemProps && option.menuItemProps.onClick ? option.menuItemProps.onClick(e) : null + }} + > + + {option.icon ? option.icon : null} + {option.text} + + + ) + } + })} + + + ) +} + +export default OptionsMenu diff --git a/src/@core/components/option-menu/types.ts b/src/@core/components/option-menu/types.ts new file mode 100644 index 0000000..5d1c309 --- /dev/null +++ b/src/@core/components/option-menu/types.ts @@ -0,0 +1,42 @@ +// ** React Import +import { ReactNode } from 'react' + +// ** MUI Imports +import { MenuProps } from '@mui/material/Menu' +import { DividerProps } from '@mui/material/Divider' +import { MenuItemProps } from '@mui/material/MenuItem' +import { IconButtonProps } from '@mui/material/IconButton' + +// ** Types +import { LinkProps } from 'next/link' +import { IconProps } from '@iconify/react' + +export type OptionDividerType = { + divider: boolean + dividerProps?: DividerProps + href?: never + icon?: never + text?: never + linkProps?: never + menuItemProps?: never +} +export type OptionMenuItemType = { + text: ReactNode + icon?: ReactNode + linkProps?: LinkProps + href?: LinkProps['href'] + menuItemProps?: MenuItemProps + divider?: never + dividerProps?: never +} + +export type OptionType = string | OptionDividerType | OptionMenuItemType + +export type OptionsMenuType = { + icon?: ReactNode + options: OptionType[] + leftAlignMenu?: boolean + iconButtonProps?: IconButtonProps + iconProps?: Omit + menuProps?: Omit +} diff --git a/src/@core/components/page-header/index.tsx b/src/@core/components/page-header/index.tsx new file mode 100644 index 0000000..8df7510 --- /dev/null +++ b/src/@core/components/page-header/index.tsx @@ -0,0 +1,19 @@ +// ** MUI Imports +import Grid from '@mui/material/Grid' + +// ** Types +import { PageHeaderProps } from './types' + +const PageHeader = (props: PageHeaderProps) => { + // ** Props + const { title, subtitle } = props + + return ( + + {title} + {subtitle || null} + + ) +} + +export default PageHeader diff --git a/src/@core/components/page-header/types.ts b/src/@core/components/page-header/types.ts new file mode 100644 index 0000000..16023df --- /dev/null +++ b/src/@core/components/page-header/types.ts @@ -0,0 +1,6 @@ +import { ReactNode } from 'react' + +export type PageHeaderProps = { + title: ReactNode + subtitle?: ReactNode +} diff --git a/src/@core/components/plan-details/index.tsx b/src/@core/components/plan-details/index.tsx new file mode 100644 index 0000000..0d5dfde --- /dev/null +++ b/src/@core/components/plan-details/index.tsx @@ -0,0 +1,121 @@ +// ** MUI Imports +import Button from '@mui/material/Button' +import { styled } from '@mui/material/styles' +import Typography from '@mui/material/Typography' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Util Import +import { hexToRGBA } from 'src/@core/utils/hex-to-rgba' + +// ** Custom Components Imports +import CustomChip from 'src/@core/components/mui/chip' + +// ** Types +import { PricingPlanProps } from './types' + +// ** Styled Component for the wrapper of whole component +const BoxWrapper = styled(Box)(({ theme }) => ({ + position: 'relative', + padding: theme.spacing(6), + paddingTop: theme.spacing(16), + borderRadius: theme.shape.borderRadius +})) + +// ** Styled Component for the wrapper of all the features of a plan +const BoxFeature = styled(Box)(({ theme }) => ({ + marginBottom: theme.spacing(4), + '& > :not(:last-child)': { + marginBottom: theme.spacing(2.5) + } +})) + +const PlanDetails = (props: PricingPlanProps) => { + // ** Props + const { plan, data } = props + + const renderFeatures = () => { + return data?.planBenefits.map((item: string, index: number) => ( + + + + + {item} + + )) + } + + return ( + + !data?.popularPlan + ? `1px solid ${theme.palette.divider}` + : `1px solid ${hexToRGBA(theme.palette.primary.main, 0.5)}` + }} + > + {data?.popularPlan ? ( + + ) : null} + + {`${data?.title.toLowerCase().replace(' + + + + {data?.title} + + {data?.subtitle} + + + + $ + + + {plan === 'monthly' ? data?.monthlyPrice : data?.yearlyPlan.perMonth} + + /month + + {plan !== 'monthly' && data?.monthlyPrice !== 0 ? ( + {`USD ${data?.yearlyPlan.totalAnnual}/year`} + ) : null} + + + {renderFeatures()} + + + ) +} + +export default PlanDetails diff --git a/src/@core/components/plan-details/types.ts b/src/@core/components/plan-details/types.ts new file mode 100644 index 0000000..44bc3fb --- /dev/null +++ b/src/@core/components/plan-details/types.ts @@ -0,0 +1,39 @@ +export type PricingPlanType = { + title: string + imgSrc: string + subtitle: string + imgWidth?: number + imgHeight?: number + currentPlan: boolean + popularPlan: boolean + monthlyPrice: number + planBenefits: string[] + yearlyPlan: { + perMonth: number + totalAnnual: number + } +} + +export type PricingPlanProps = { + plan: string + data?: PricingPlanType +} + +export type PricingFaqType = { + id: string + answer: string + question: string +} + +export type PricingTableRowType = { feature: string; starter: boolean; pro: boolean | string; enterprise: boolean } + +export type PricingTableType = { + header: { title: string; subtitle: string; isPro?: boolean }[] + rows: PricingTableRowType[] +} + +export type PricingDataType = { + faq: PricingFaqType[] + pricingTable: PricingTableType + pricingPlans: PricingPlanType[] +} diff --git a/src/@core/components/react-apexcharts/index.tsx b/src/@core/components/react-apexcharts/index.tsx new file mode 100644 index 0000000..e8d2b2d --- /dev/null +++ b/src/@core/components/react-apexcharts/index.tsx @@ -0,0 +1,7 @@ +// ** Next Import +import dynamic from 'next/dynamic' + +// ! To avoid 'Window is not defined' error +const ReactApexcharts = dynamic(() => import('react-apexcharts'), { ssr: false }) + +export default ReactApexcharts diff --git a/src/@core/components/react-draft-wysiwyg/index.tsx b/src/@core/components/react-draft-wysiwyg/index.tsx new file mode 100644 index 0000000..a387a0a --- /dev/null +++ b/src/@core/components/react-draft-wysiwyg/index.tsx @@ -0,0 +1,12 @@ +// ** Next Import +import dynamic from 'next/dynamic' + +// ** Types +import { EditorProps } from 'react-draft-wysiwyg' + +// ! To avoid 'Window is not defined' error +const ReactDraftWysiwyg = dynamic(() => import('react-draft-wysiwyg').then(mod => mod.Editor), { + ssr: false +}) + +export default ReactDraftWysiwyg diff --git a/src/@core/components/repeater/index.tsx b/src/@core/components/repeater/index.tsx new file mode 100644 index 0000000..1af33e1 --- /dev/null +++ b/src/@core/components/repeater/index.tsx @@ -0,0 +1,22 @@ +// ** Types +import { RepeaterProps } from './types' + +const Repeater = (props: RepeaterProps) => { + // ** Props + const { count, tag, children } = props + + // ** Custom Tag + const Tag = tag || 'div' + + // ** Default Items + const items = [] + + // ** Loop passed count times and push it in items Array + for (let i = 0; i < count; i++) { + items.push(children(i)) + } + + return {items} +} + +export default Repeater diff --git a/src/@core/components/repeater/types.ts b/src/@core/components/repeater/types.ts new file mode 100644 index 0000000..c709c21 --- /dev/null +++ b/src/@core/components/repeater/types.ts @@ -0,0 +1,8 @@ +// ** React Imports +import { ReactNode, ComponentType } from 'react' + +export type RepeaterProps = { + count: number + children(i: number): ReactNode + tag?: ComponentType | keyof JSX.IntrinsicElements +} diff --git a/src/@core/components/scroll-to-top/index.tsx b/src/@core/components/scroll-to-top/index.tsx new file mode 100644 index 0000000..30bed5d --- /dev/null +++ b/src/@core/components/scroll-to-top/index.tsx @@ -0,0 +1,47 @@ +// ** React Imports +import { ReactNode } from 'react' + +// ** MUI Imports +import Zoom from '@mui/material/Zoom' +import { styled } from '@mui/material/styles' +import useScrollTrigger from '@mui/material/useScrollTrigger' + +interface ScrollToTopProps { + className?: string + children: ReactNode +} + +const ScrollToTopStyled = styled('div')(({ theme }) => ({ + zIndex: 11, + position: 'fixed', + right: theme.spacing(6), + bottom: theme.spacing(10) +})) + +const ScrollToTop = (props: ScrollToTopProps) => { + // ** Props + const { children, className } = props + + // ** init trigger + const trigger = useScrollTrigger({ + threshold: 400, + disableHysteresis: true + }) + + const handleClick = () => { + const anchor = document.querySelector('body') + if (anchor) { + anchor.scrollIntoView({ behavior: 'smooth' }) + } + } + + return ( + + + {children} + + + ) +} + +export default ScrollToTop diff --git a/src/@core/components/sidebar/index.tsx b/src/@core/components/sidebar/index.tsx new file mode 100644 index 0000000..e559c37 --- /dev/null +++ b/src/@core/components/sidebar/index.tsx @@ -0,0 +1,65 @@ +// ** React Imports +import { Fragment, useEffect } from 'react' + +// ** MUI Imports +import Backdrop from '@mui/material/Backdrop' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Types +import { SidebarType } from './type' + +const Sidebar = (props: BoxProps & SidebarType) => { + // ** Props + const { sx, show, direction, children, hideBackdrop, onOpen, onClose, backDropClick } = props + + const handleBackdropClick = () => { + if (backDropClick) { + backDropClick() + } + } + + useEffect(() => { + if (show && onOpen) { + onOpen() + } + if (show === false && onClose) { + onClose() + } + }, [onClose, onOpen, show]) + + return ( + + + {children} + + {hideBackdrop ? null : ( + theme.zIndex.drawer - 1 }} + /> + )} + + ) +} + +export default Sidebar + +Sidebar.defaultProps = { + direction: 'left' +} diff --git a/src/@core/components/sidebar/type.ts b/src/@core/components/sidebar/type.ts new file mode 100644 index 0000000..cd806ed --- /dev/null +++ b/src/@core/components/sidebar/type.ts @@ -0,0 +1,12 @@ +// ** React Imports +import { ReactNode } from 'react' + +export type SidebarType = { + show: boolean + onOpen?: () => void + children: ReactNode + onClose?: () => void + hideBackdrop?: boolean + backDropClick?: () => void + direction?: 'left' | 'right' +} diff --git a/src/@core/components/spinner/index.tsx b/src/@core/components/spinner/index.tsx new file mode 100644 index 0000000..0ccbc1f --- /dev/null +++ b/src/@core/components/spinner/index.tsx @@ -0,0 +1,54 @@ +// ** MUI Imports +import { useTheme } from '@mui/material/styles' +import Box, { BoxProps } from '@mui/material/Box' +import CircularProgress from '@mui/material/CircularProgress' + +const FallbackSpinner = ({ sx }: { sx?: BoxProps['sx'] }) => { + // ** Hook + const theme = useTheme() + + return ( + + + + + + + + + + ) +} + +export default FallbackSpinner diff --git a/src/@core/components/window-wrapper/index.tsx b/src/@core/components/window-wrapper/index.tsx new file mode 100644 index 0000000..d4d0eb0 --- /dev/null +++ b/src/@core/components/window-wrapper/index.tsx @@ -0,0 +1,35 @@ +// ** React Imports +import { useState, useEffect, ReactNode } from 'react' + +// ** Next Import +import { useRouter } from 'next/router' + +interface Props { + children: ReactNode +} + +const WindowWrapper = ({ children }: Props) => { + // ** State + const [windowReadyFlag, setWindowReadyFlag] = useState(false) + + const router = useRouter() + + useEffect( + () => { + if (typeof window !== 'undefined') { + setWindowReadyFlag(true) + } + }, + + // eslint-disable-next-line react-hooks/exhaustive-deps + [router.route] + ) + + if (windowReadyFlag) { + return <>{children} + } else { + return null + } +} + +export default WindowWrapper diff --git a/src/@core/context/settingsContext.tsx b/src/@core/context/settingsContext.tsx new file mode 100644 index 0000000..4902d39 --- /dev/null +++ b/src/@core/context/settingsContext.tsx @@ -0,0 +1,155 @@ +// ** React Imports +import { createContext, useState, ReactNode, useEffect } from 'react' + +// ** MUI Imports +import { Direction } from '@mui/material' + +// ** ThemeConfig Import +import themeConfig from 'src/configs/themeConfig' + +// ** Types Import +import { Skin, Mode, AppBar, Footer, ThemeColor, ContentWidth, VerticalNavToggle } from 'src/@core/layouts/types' + +export type Settings = { + skin: Skin + mode: Mode + appBar?: AppBar + footer?: Footer + navHidden?: boolean // navigation menu + appBarBlur: boolean + direction: Direction + navCollapsed: boolean + themeColor: ThemeColor + contentWidth: ContentWidth + layout?: 'vertical' | 'horizontal' + lastLayout?: 'vertical' | 'horizontal' + verticalNavToggleType: VerticalNavToggle + toastPosition?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' +} + +export type PageSpecificSettings = { + skin?: Skin + mode?: Mode + appBar?: AppBar + footer?: Footer + navHidden?: boolean // navigation menu + appBarBlur?: boolean + direction?: Direction + navCollapsed?: boolean + themeColor?: ThemeColor + contentWidth?: ContentWidth + layout?: 'vertical' | 'horizontal' + lastLayout?: 'vertical' | 'horizontal' + verticalNavToggleType?: VerticalNavToggle + toastPosition?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' +} +export type SettingsContextValue = { + settings: Settings + saveSettings: (updatedSettings: Settings) => void +} + +interface SettingsProviderProps { + children: ReactNode + pageSettings?: PageSpecificSettings | void +} + +const initialSettings: Settings = { + themeColor: 'primary', + mode: themeConfig.mode, + skin: themeConfig.skin, + footer: themeConfig.footer, + layout: themeConfig.layout, + lastLayout: themeConfig.layout, + direction: themeConfig.direction, + navHidden: themeConfig.navHidden, + appBarBlur: themeConfig.appBarBlur, + navCollapsed: themeConfig.navCollapsed, + contentWidth: themeConfig.contentWidth, + toastPosition: themeConfig.toastPosition, + verticalNavToggleType: themeConfig.verticalNavToggleType, + appBar: themeConfig.layout === 'horizontal' && themeConfig.appBar === 'hidden' ? 'fixed' : themeConfig.appBar +} + +const staticSettings = { + appBar: initialSettings.appBar, + footer: initialSettings.footer, + layout: initialSettings.layout, + navHidden: initialSettings.navHidden, + lastLayout: initialSettings.lastLayout, + toastPosition: initialSettings.toastPosition +} + +const restoreSettings = (): Settings | null => { + let settings = null + + try { + const storedData: string | null = window.localStorage.getItem('settings') + + if (storedData) { + settings = { ...JSON.parse(storedData), ...staticSettings } + } else { + settings = initialSettings + } + } catch (err) { + console.error(err) + } + + return settings +} + +// set settings in localStorage +const storeSettings = (settings: Settings) => { + const initSettings = Object.assign({}, settings) + + delete initSettings.appBar + delete initSettings.footer + delete initSettings.layout + delete initSettings.navHidden + delete initSettings.lastLayout + delete initSettings.toastPosition + window.localStorage.setItem('settings', JSON.stringify(initSettings)) +} + +// ** Create Context +export const SettingsContext = createContext({ + saveSettings: () => null, + settings: initialSettings +}) + +export const SettingsProvider = ({ children, pageSettings }: SettingsProviderProps) => { + // ** State + const [settings, setSettings] = useState({ ...initialSettings }) + + useEffect(() => { + const restoredSettings = restoreSettings() + + if (restoredSettings) { + setSettings({ ...restoredSettings }) + } + if (pageSettings) { + setSettings({ ...settings, ...pageSettings }) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pageSettings]) + + useEffect(() => { + if (settings.layout === 'horizontal' && settings.mode === 'semi-dark') { + saveSettings({ ...settings, mode: 'light' }) + } + if (settings.layout === 'horizontal' && settings.appBar === 'hidden') { + saveSettings({ ...settings, appBar: 'fixed' }) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [settings.layout]) + + const saveSettings = (updatedSettings: Settings) => { + storeSettings(updatedSettings) + setSettings(updatedSettings) + } + + return {children} +} + +export const SettingsConsumer = SettingsContext.Consumer diff --git a/src/@core/hooks/useBgColor.tsx b/src/@core/hooks/useBgColor.tsx new file mode 100644 index 0000000..44bf554 --- /dev/null +++ b/src/@core/hooks/useBgColor.tsx @@ -0,0 +1,70 @@ +// ** MUI Imports +import { useTheme } from '@mui/material/styles' + +// ** Util Import +import { hexToRGBA } from 'src/@core/utils/hex-to-rgba' + +export type UseBgColorType = { + [key: string]: { + color: string + backgroundColor: string + } +} + +const UseBgColor = () => { + // ** Hooks + const theme = useTheme() + + return { + primaryFilled: { + color: theme.palette.primary.contrastText, + backgroundColor: theme.palette.primary.main + }, + primaryLight: { + color: theme.palette.primary.main, + backgroundColor: hexToRGBA(theme.palette.primary.main, 0.16) + }, + secondaryFilled: { + color: theme.palette.secondary.contrastText, + backgroundColor: theme.palette.secondary.main + }, + secondaryLight: { + color: theme.palette.secondary.main, + backgroundColor: hexToRGBA(theme.palette.secondary.main, 0.16) + }, + successFilled: { + color: theme.palette.success.contrastText, + backgroundColor: theme.palette.success.main + }, + successLight: { + color: theme.palette.success.main, + backgroundColor: hexToRGBA(theme.palette.success.main, 0.16) + }, + errorFilled: { + color: theme.palette.error.contrastText, + backgroundColor: theme.palette.error.main + }, + errorLight: { + color: theme.palette.error.main, + backgroundColor: hexToRGBA(theme.palette.error.main, 0.16) + }, + warningFilled: { + color: theme.palette.warning.contrastText, + backgroundColor: theme.palette.warning.main + }, + warningLight: { + color: theme.palette.warning.main, + backgroundColor: hexToRGBA(theme.palette.warning.main, 0.16) + }, + infoFilled: { + color: theme.palette.info.contrastText, + backgroundColor: theme.palette.info.main + }, + infoLight: { + color: theme.palette.info.main, + backgroundColor: hexToRGBA(theme.palette.info.main, 0.16) + } + } +} + +export default UseBgColor diff --git a/src/@core/hooks/useClipboard.tsx b/src/@core/hooks/useClipboard.tsx new file mode 100644 index 0000000..b397c51 --- /dev/null +++ b/src/@core/hooks/useClipboard.tsx @@ -0,0 +1,65 @@ +// ** React Imports +import { RefObject, useCallback, useRef } from 'react' + +// ** Third Party Imports +import copy from 'clipboard-copy' + +interface UseClipboardOptions { + copiedTimeout?: number + onSuccess?: () => void + onError?: () => void + selectOnCopy?: boolean + selectOnError?: boolean +} + +interface ClipboardAPI { + readonly copy: (text?: string | any) => void + readonly target: RefObject +} + +const isInputLike = (node: any): node is HTMLInputElement | HTMLTextAreaElement => { + return node && (node.nodeName === 'TEXTAREA' || node.nodeName === 'INPUT') +} + +const useClipboard = (options: UseClipboardOptions = {}): ClipboardAPI => { + const targetRef = useRef(null) + + const handleSuccess = () => { + if (options.onSuccess) { + options.onSuccess() + } + if (options.selectOnCopy && isInputLike(targetRef.current)) { + targetRef.current.select() + } + } + + const handleError = () => { + if (options.onError) { + options.onError() + } + const selectOnError = options.selectOnError !== false + if (selectOnError && isInputLike(targetRef.current)) { + targetRef.current.select() + } + } + + const clipboardCopy = (text: string) => { + copy(text).then(handleSuccess).catch(handleError) + } + + const copyHandler = useCallback((text?: string | HTMLElement) => { + if (typeof text === 'string') { + clipboardCopy(text) + } else if (targetRef.current) { + clipboardCopy(targetRef.current.value) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return { + copy: copyHandler, + target: targetRef + } +} + +export default useClipboard diff --git a/src/@core/hooks/useSettings.ts b/src/@core/hooks/useSettings.ts new file mode 100644 index 0000000..976cc13 --- /dev/null +++ b/src/@core/hooks/useSettings.ts @@ -0,0 +1,4 @@ +import { useContext } from 'react' +import { SettingsContext, SettingsContextValue } from 'src/@core/context/settingsContext' + +export const useSettings = (): SettingsContextValue => useContext(SettingsContext) diff --git a/src/@core/layouts/BlankLayout.tsx b/src/@core/layouts/BlankLayout.tsx new file mode 100644 index 0000000..7d82694 --- /dev/null +++ b/src/@core/layouts/BlankLayout.tsx @@ -0,0 +1,40 @@ +// ** MUI Imports +import { styled } from '@mui/material/styles' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Types +import { BlankLayoutProps } from './types' + +// Styled component for Blank Layout component +const BlankLayoutWrapper = styled(Box)(({ theme }) => ({ + height: '100vh', + + // For V1 Blank layout pages + '& .content-center': { + display: 'flex', + minHeight: '100vh', + alignItems: 'center', + justifyContent: 'center', + padding: theme.spacing(5) + }, + + // For V2 Blank layout pages + '& .content-right': { + display: 'flex', + minHeight: '100vh', + overflowX: 'hidden', + position: 'relative' + } +})) + +const BlankLayout = ({ children }: BlankLayoutProps) => { + return ( + + + {children} + + + ) +} + +export default BlankLayout diff --git a/src/@core/layouts/BlankLayoutWithAppBar.tsx b/src/@core/layouts/BlankLayoutWithAppBar.tsx new file mode 100644 index 0000000..c11eefb --- /dev/null +++ b/src/@core/layouts/BlankLayoutWithAppBar.tsx @@ -0,0 +1,54 @@ +// ** MUI Imports +import { styled } from '@mui/material/styles' +import Box, { BoxProps } from '@mui/material/Box' + +// ** Types +import { BlankLayoutWithAppBarProps } from './types' + +// ** AppBar Imports +import AppBar from 'src/@core/layouts/components/blank-layout-with-appBar' + +// Styled component for Blank Layout with AppBar component +const BlankLayoutWithAppBarWrapper = styled(Box)(({ theme }) => ({ + height: '100vh', + + // For V1 Blank layout pages + '& .content-center': { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + padding: theme.spacing(5), + minHeight: `calc(100vh - ${theme.spacing((theme.mixins.toolbar.minHeight as number) / 4)})` + }, + + // For V2 Blank layout pages + '& .content-right': { + display: 'flex', + overflowX: 'hidden', + position: 'relative', + minHeight: `calc(100vh - ${theme.spacing((theme.mixins.toolbar.minHeight as number) / 4)})` + } +})) + +const BlankLayoutWithAppBar = (props: BlankLayoutWithAppBarProps) => { + // ** Props + const { children } = props + + return ( + + + `calc(100vh - ${theme.spacing((theme.mixins.toolbar.minHeight as number) / 4)})` + }} + > + {children} + + + ) +} + +export default BlankLayoutWithAppBar diff --git a/src/@core/layouts/HorizontalLayout.tsx b/src/@core/layouts/HorizontalLayout.tsx new file mode 100644 index 0000000..3a5f4ac --- /dev/null +++ b/src/@core/layouts/HorizontalLayout.tsx @@ -0,0 +1,195 @@ +// ** MUI Imports +import Fab from '@mui/material/Fab' +import AppBar from '@mui/material/AppBar' +import { styled } from '@mui/material/styles' +import Box, { BoxProps } from '@mui/material/Box' +import MuiToolbar, { ToolbarProps } from '@mui/material/Toolbar' + +// ** Icon Imports +import Icon from 'src/@core/components/icon' + +// ** Theme Config Import +import themeConfig from 'src/configs/themeConfig' + +// ** Type Import +import { LayoutProps } from 'src/@core/layouts/types' + +// ** Components +import Customizer from 'src/@core/components/customizer' +import Footer from './components/shared-components/footer' +import Navigation from './components/horizontal/navigation' +import ScrollToTop from 'src/@core/components/scroll-to-top' +import AppBarContent from './components/horizontal/app-bar-content' + +// ** Util Import +import { hexToRGBA } from '../utils/hex-to-rgba' + +const HorizontalLayoutWrapper = styled('div')({ + height: '100%', + display: 'flex', + ...(themeConfig.horizontalMenuAnimation && { overflow: 'clip' }) +}) + +const MainContentWrapper = styled(Box)({ + flexGrow: 1, + minWidth: 0, + display: 'flex', + minHeight: '100vh', + flexDirection: 'column' +}) + +const Toolbar = styled(MuiToolbar)(({ theme }) => ({ + width: '100%', + padding: `${theme.spacing(0, 6)} !important`, + [theme.breakpoints.down('sm')]: { + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(4) + }, + [theme.breakpoints.down('xs')]: { + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(2) + } +})) + +const ContentWrapper = styled('main')(({ theme }) => ({ + flexGrow: 1, + width: '100%', + padding: theme.spacing(6), + transition: 'padding .25s ease-in-out', + [theme.breakpoints.down('sm')]: { + paddingLeft: theme.spacing(4), + paddingRight: theme.spacing(4) + } +})) + +const HorizontalLayout = (props: LayoutProps) => { + // ** Props + const { + hidden, + children, + settings, + scrollToTop, + footerProps, + saveSettings, + contentHeightFixed, + horizontalLayoutProps + } = props + + // ** Vars + const { skin, appBar, navHidden, appBarBlur, contentWidth } = settings + const appBarProps = horizontalLayoutProps?.appBar?.componentProps + const userNavMenuContent = horizontalLayoutProps?.navMenu?.content + + let userAppBarStyle = {} + if (appBarProps && appBarProps.sx) { + userAppBarStyle = appBarProps.sx + } + const userAppBarProps = Object.assign({}, appBarProps) + delete userAppBarProps.sx + + return ( + + + {/* Navbar (or AppBar) and Navigation Menu Wrapper */} + hexToRGBA(theme.palette.background.paper, appBarBlur ? 0.95 : 1), + ...(skin === 'bordered' && { borderBottom: theme => `1px solid ${theme.palette.divider}` }), + ...userAppBarStyle + }} + {...userAppBarProps} + > + {/* Navbar / AppBar */} + `1px solid ${theme.palette.divider}` }) + }} + > + `${(theme.mixins.toolbar.minHeight as number) - 1}px !important` + }} + > + + + {/* Navigation Menu */} + {navHidden ? null : ( + + + `${(theme.mixins.toolbar.minHeight as number) - 4 - (skin === 'bordered' ? 1 : 0)}px !important` + }} + > + {(userNavMenuContent && userNavMenuContent(props)) || ( + ).navMenu?.navItems + } + /> + )} + + + )} + + {/* Content */} + + {children} + + {/* Footer */} +