commit fffa2ead5c687d334f9970df5cd7f5f7a844a60d Author: ferdiansyah783 Date: Tue Aug 5 12:35:40 2025 +0700 initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f709510 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# Editor configuration, see http://editorconfig.org +root = true +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +[*.md] +max_line_length = off +trim_trailing_whitespace = false +[*.yml] +[*.{yml,yaml}] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..bf026fa --- /dev/null +++ b/.env.example @@ -0,0 +1,33 @@ +# ----------------------------------------------------------------------------- +# App +# ----------------------------------------------------------------------------- +BASEPATH= +NEXT_PUBLIC_APP_URL=http://localhost:3000${BASEPATH} +NEXT_PUBLIC_DOCS_URL=https://demos.pixinvent.com/vuexy-nextjs-admin-template/documentation + +# ----------------------------------------------------------------------------- +# Authentication (NextAuth.js) +# ----------------------------------------------------------------------------- +NEXTAUTH_BASEPATH=${BASEPATH}/api/auth +NEXTAUTH_URL=http://localhost:3000${BASEPATH}/api/auth +NEXTAUTH_SECRET= + +# Google OAuth 2.0 (https://console.cloud.google.com/apis/credentials) +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= + +# ----------------------------------------------------------------------------- +# Database +# ----------------------------------------------------------------------------- +DATABASE_URL= + +# ----------------------------------------------------------------------------- +# API +# ----------------------------------------------------------------------------- +API_URL=http://localhost:3000${BASEPATH}/api +NEXT_PUBLIC_API_URL=${API_URL} + +# ----------------------------------------------------------------------------- +# Mapbox +# ----------------------------------------------------------------------------- +MAPBOX_ACCESS_TOKEN= diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..70fda91 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,128 @@ +module.exports = { + extends: ['next/core-web-vitals', 'plugin:@typescript-eslint/recommended', 'plugin:import/recommended', 'prettier'], + rules: { + 'jsx-a11y/alt-text': 'off', + 'react/display-name': 'off', + 'react/no-children-prop': 'off', + '@next/next/no-img-element': 'off', + '@next/next/no-page-custom-font': 'off', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': 'error', + '@typescript-eslint/no-non-null-assertion': 'off', + 'lines-around-comment': [ + 'error', + { + beforeBlockComment: true, + beforeLineComment: true, + allowBlockStart: true, + allowObjectStart: true, + allowArrayStart: true + } + ], + 'padding-line-between-statements': [ + 'error', + { + blankLine: 'any', + prev: 'export', + next: 'export' + }, + { + blankLine: 'always', + prev: ['const', 'let', 'var'], + next: '*' + }, + { + blankLine: 'any', + prev: ['const', 'let', 'var'], + next: ['const', 'let', 'var'] + }, + { + blankLine: 'always', + prev: '*', + next: ['function', 'multiline-const', 'multiline-block-like'] + }, + { + blankLine: 'always', + prev: ['function', 'multiline-const', 'multiline-block-like'], + next: '*' + } + ], + 'newline-before-return': 'error', + 'import/newline-after-import': [ + 'error', + { + count: 1 + } + ], + 'import/order': [ + 'error', + { + groups: ['builtin', 'external', ['internal', 'parent', 'sibling', 'index'], ['object', 'unknown']], + pathGroups: [ + { + pattern: 'react', + group: 'external', + position: 'before' + }, + { + pattern: 'next/**', + group: 'external', + position: 'before' + }, + { + pattern: '~/**', + group: 'external', + position: 'before' + }, + { + pattern: '@/**', + group: 'internal' + } + ], + pathGroupsExcludedImportTypes: ['react', 'type'], + 'newlines-between': 'always-and-inside-groups' + } + ], + '@typescript-eslint/ban-types': [ + 'error', + { + extendDefaults: true, + types: { + Function: 'Use a specific function type instead', + Object: 'Use object instead', + Boolean: 'Use boolean instead', + Number: 'Use number instead', + String: 'Use string instead', + Symbol: 'Use symbol instead', + any: false, + '{}': false + } + } + ] + }, + settings: { + react: { + version: 'detect' + }, + 'import/parsers': { + '@typescript-eslint/parser': ['.ts', '.tsx'] + }, + 'import/resolver': { + node: {}, + typescript: { + project: './tsconfig.json' + } + } + }, + overrides: [ + { + files: ['*.ts', '*.tsx', 'src/iconify-bundle/*'], + rules: { + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-var-requires': 'off' + } + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5a2dee --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# icon generated file +src/assets/iconify-icons/generated-icons.js +src/assets/iconify-icons/generated-icons.css diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..15cbb08 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +auto-install-peers=true +shamefully-hoist=true +node-linker=hoisted diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..fef33e0 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,17 @@ +{ + "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/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..0408dc5 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,16 @@ +{ + "plugins": [ + "stylelint-use-logical-spec" + ], + "overrides": [ + { + "customSyntax": "postcss-styled-syntax", + "files": [ + "**/*.{js,ts,jsx,tsx}" + ] + } + ], + "rules": { + "liberty/use-logical-spec": "always" + } +} diff --git a/.vscode/custom.code-snippets b/.vscode/custom.code-snippets new file mode 100644 index 0000000..141c1c6 --- /dev/null +++ b/.vscode/custom.code-snippets @@ -0,0 +1,109 @@ +{ + // JavaScript Snippets + "exportDefault": { + "prefix": "exp", + "body": [ + "export default ${1:moduleName}", + "" + ] + }, + "exportDestructing": { + "prefix": "exd", + "body": [ + "export { ${2:destructuredModule} } from '${1:module}'", + "" + ] + }, + "exportAs": { + "prefix": "exa", + "body": [ + "export { ${2:originalName} as ${3:aliasName}} from '${1:module}'", + "" + ] + }, + "exportDefaultFunction": { + "prefix": "edf", + "body": [ + "export default (${1:params}) => {", + " $0", + "}", + "" + ] + }, + "exportDefaultNamedFunction": { + "prefix": "ednf", + "body": [ + "export default function ${1:functionName}(${2:params}) {", + " $0", + "}", + "" + ] + }, + // React Snippets + "reactArrowFunctionExportComponent": { + "prefix": "rafce", + "body": [ + "const ${1:ComponentName} = () => {", + " return (", + " $0", + " )", + "}", + "", + "export default ${1:ComponentName}", + "" + ] + }, + "reactArrowFunctionComponent": { + "prefix": "rafc", + "body": [ + "const ${1:ComponentName} = () => {", + " return (", + " $0", + " )", + "}", + "" + ] + }, + "reactUseState": { + "prefix": "useState", + "body": [ + "const [${1:state}, set${1/(.*)/${1:/capitalize}/}] = useState(${2:initialState})" + ] + }, + "reactUseEffect": { + "prefix": "useEffect", + "body": [ + "useEffect(() => {", + " $0", + "}, [])" + ] + }, + // Type Snippets + "exportType": { + "prefix": "exptp", + "body": [ + "export type ${1:Props} = {", + " ${2:name}: ${3:string}", + "}", + "" + ] + }, + "type": { + "prefix": "tp", + "body": [ + "type ${1:Props} = {", + " ${2:name}: ${3:string}", + "}", + "" + ] + }, + // Next Snippets + "nextImport": { + "prefix": "impn", + "body": [ + "// Next Import", + "import ${2:second} from '${1:first}'", + "" + ] + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..74a42e0 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,26 @@ +{ + "recommendations": [ + "formulahendry.auto-close-tag", + "steoates.autoimport", + "mgmcdermott.vscode-language-babel", + "aaron-bond.better-comments", + "MohammadBaqer.better-folding", + "pustelto.bracketeer", + "streetsidesoftware.code-spell-checker", + "naumovs.color-highlight", + "mikestead.dotenv", + "EditorConfig.EditorConfig", + "usernamehw.errorlens", + "dbaeumer.vscode-eslint", + "eamodio.gitlens", + "antfu.iconify", + "xabikos.JavaScriptSnippets", + "christian-kohler.npm-intellisense", + "christian-kohler.path-intellisense", + "esbenp.prettier-vscode", + "yoavbls.pretty-ts-errors", + "jasonnutter.search-node-modules", + "stylelint.vscode-stylelint", + "styled-components.vscode-styled-components" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7311db2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,53 @@ +{ + // JS + "javascript.updateImportsOnFileMove.enabled": "always", + // JSON + "[json]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + // VSCode Editor + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never", + "source.fixAll.stylelint": "explicit" + }, + // Extension: Git + "git.rebaseWhenSync": true, + "git.autofetch": true, + "git.enableSmartCommit": true, + // Extension: Prettier + "prettier.requireConfig": true, + // Extension: ESLint + "eslint.validate": [ + "javascript", + "typescript", + "javascriptreact", + "typescriptreact" + ], + "eslint.format.enable": true, + // Stylelint + "css.validate": false, + "less.validate": false, + "scss.validate": false, + "stylelint.enable": true, + "stylelint.validate": [ + "css", + "scss", + "typescript", + "typescriptreact" + ], + "markdown.extension.toc.updateOnSave": false, + "files.insertFinalNewline": true, + "editor.linkedEditing": true, + "typescript.tsdk": "node_modules/typescript/lib", + "cSpell.words": [ + "customizer", + "iconify", + "tanstack" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..f4da3c4 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/declarations.d.ts b/declarations.d.ts new file mode 100644 index 0000000..8c9893e --- /dev/null +++ b/declarations.d.ts @@ -0,0 +1 @@ +declare module 'tailwindcss-logical' diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ef6f0 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,29 @@ +import type { NextConfig } from 'next' + +const nextConfig: NextConfig = { + basePath: process.env.BASEPATH, + redirects: async () => { + return [ + { + source: '/', + destination: '/en/dashboards/crm', + permanent: true, + locale: false + }, + { + source: '/:lang(en|fr|ar)', + destination: '/:lang/dashboards/crm', + permanent: true, + locale: false + }, + { + source: '/((?!(?:en|fr|ar|front-pages|favicon.ico)\\b)):path', + destination: '/en/:path', + permanent: true, + locale: false + } + ] + } +} + +export default nextConfig diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4234895 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12974 @@ +{ + "name": "vuexy-mui-nextjs-admin-template", + "version": "4.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vuexy-mui-nextjs-admin-template", + "version": "4.0.0", + "license": "Commercial", + "dependencies": { + "@emoji-mart/data": "1.2.1", + "@emoji-mart/react": "1.1.1", + "@emotion/cache": "11.14.0", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", + "@floating-ui/react": "0.27.2", + "@formatjs/intl-localematcher": "0.5.9", + "@formkit/drag-and-drop": "0.2.6", + "@fullcalendar/common": "5.11.5", + "@fullcalendar/core": "6.1.15", + "@fullcalendar/daygrid": "6.1.15", + "@fullcalendar/interaction": "6.1.15", + "@fullcalendar/list": "6.1.15", + "@fullcalendar/react": "6.1.15", + "@fullcalendar/timegrid": "6.1.15", + "@hookform/resolvers": "3.9.1", + "@mui/lab": "6.0.0-beta.19", + "@mui/material": "6.2.1", + "@mui/material-nextjs": "6.2.1", + "@reduxjs/toolkit": "2.5.0", + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-query": "^5.84.1", + "@tanstack/react-query-devtools": "^5.84.1", + "@tanstack/react-table": "8.20.6", + "@tiptap/extension-color": "^2.10.4", + "@tiptap/extension-list-item": "^2.10.4", + "@tiptap/extension-placeholder": "^2.10.4", + "@tiptap/extension-text-align": "^2.10.4", + "@tiptap/extension-text-style": "^2.10.4", + "@tiptap/extension-underline": "^2.10.4", + "@tiptap/pm": "^2.10.4", + "@tiptap/react": "^2.10.4", + "@tiptap/starter-kit": "^2.10.4", + "apexcharts": "3.49.0", + "axios": "^1.11.0", + "bootstrap-icons": "1.11.3", + "classnames": "2.5.1", + "cmdk": "1.0.4", + "date-fns": "4.1.0", + "emoji-mart": "5.6.0", + "fs-extra": "11.2.0", + "input-otp": "1.4.1", + "keen-slider": "6.8.6", + "mapbox-gl": "3.9.0", + "negotiator": "1.0.0", + "next": "15.1.2", + "react": "18.3.1", + "react-apexcharts": "1.4.1", + "react-colorful": "5.6.1", + "react-datepicker": "7.3.0", + "react-dom": "18.3.1", + "react-dropzone": "14.3.5", + "react-hook-form": "7.54.1", + "react-map-gl": "7.1.8", + "react-perfect-scrollbar": "1.5.8", + "react-player": "2.16.0", + "react-redux": "9.2.0", + "react-toastify": "10.0.6", + "react-use": "17.6.0", + "recharts": "2.15.0", + "valibot": "0.42.1" + }, + "devDependencies": { + "@iconify/json": "2.2.286", + "@iconify/tools": "4.1.1", + "@iconify/types": "2.0.0", + "@iconify/utils": "2.2.1", + "@types/fs-extra": "^11.0.4", + "@types/mapbox-gl": "^3.4.1", + "@types/negotiator": "^0.6.3", + "@types/node": "^22.10.2", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "autoprefixer": "10.4.20", + "consola": "3.3.0", + "eslint": "8.57.1", + "eslint-config-next": "15.1.2", + "eslint-config-prettier": "9.1.0", + "eslint-import-resolver-typescript": "3.7.0", + "eslint-plugin-import": "2.31.0", + "globby": "14.0.2", + "postcss": "8.4.49", + "postcss-styled-syntax": "0.7.0", + "prettier": "3.4.2", + "stylelint": "16.12.0", + "stylelint-use-logical-spec": "5.0.1", + "stylis": "4.3.4", + "stylis-plugin-rtl": "2.1.1", + "tailwindcss": "3.4.17", + "tailwindcss-logical": "3.0.1", + "tsx": "4.19.2", + "typescript": "5.5.4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^0.2.0", + "tinyexec": "^0.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emoji-mart/data": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", + "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==", + "license": "MIT" + }, + "node_modules/@emoji-mart/react": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emoji-mart/react/-/react-1.1.1.tgz", + "integrity": "sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==", + "license": "MIT", + "peerDependencies": { + "emoji-mart": "^5.2", + "react": "^16.8 || ^17 || ^18" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.3.tgz", + "integrity": "sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.2.tgz", + "integrity": "sha512-k/yP6a9K9QwhLfIu87iUZxCH6XN5z5j/VUHHq0dEnbZYY2Y9jz68E/LXFtK8dkiaYltS2WYohnyKC0VcwVneVg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.5.tgz", + "integrity": "sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formkit/drag-and-drop": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@formkit/drag-and-drop/-/drag-and-drop-0.2.6.tgz", + "integrity": "sha512-yBRe5beAIRunguj/XrkW1Q1yiAG8qXyREHnn3H1osCGNUwQ/pLxQk9jbYvMGn+0/vnwa4N/he1MIteLG2GWbdQ==", + "license": "MIT" + }, + "node_modules/@fullcalendar/common": { + "version": "5.11.5", + "resolved": "https://registry.npmjs.org/@fullcalendar/common/-/common-5.11.5.tgz", + "integrity": "sha512-3iAYiUbHXhjSVXnYWz27Od2cslztUPsOwiwKlfGvQxBixv2Kl6a8IPwaijKFYJHXdwYmfPoEgK7rvqAGVoIYwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@fullcalendar/core": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.15.tgz", + "integrity": "sha512-BuX7o6ALpLb84cMw1FCB9/cSgF4JbVO894cjJZ6kP74jzbUZNjtwffwRdA+Id8rrLjT30d/7TrkW90k4zbXB5Q==", + "license": "MIT", + "dependencies": { + "preact": "~10.12.1" + } + }, + "node_modules/@fullcalendar/core/node_modules/preact": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz", + "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@fullcalendar/daygrid": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.15.tgz", + "integrity": "sha512-j8tL0HhfiVsdtOCLfzK2J0RtSkiad3BYYemwQKq512cx6btz6ZZ2RNc/hVnIxluuWFyvx5sXZwoeTJsFSFTEFA==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15" + } + }, + "node_modules/@fullcalendar/interaction": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.15.tgz", + "integrity": "sha512-DOTSkofizM7QItjgu7W68TvKKvN9PSEEvDJceyMbQDvlXHa7pm/WAVtAc6xSDZ9xmB1QramYoWGLHkCYbTW1rQ==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15" + } + }, + "node_modules/@fullcalendar/list": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.15.tgz", + "integrity": "sha512-U1bce04tYDwkFnuVImJSy2XalYIIQr6YusOWRPM/5ivHcJh67Gm8CIMSWpi3KdRSNKFkqBxLPkfZGBMaOcJYug==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15" + } + }, + "node_modules/@fullcalendar/react": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-6.1.15.tgz", + "integrity": "sha512-L0b9hybS2J4e7lq6G2CD4nqriyLEqOH1tE8iI6JQjAMTVh5JicOo5Mqw+fhU5bJ7hLfMw2K3fksxX3Ul1ssw5w==", + "license": "MIT", + "peerDependencies": { + "@fullcalendar/core": "~6.1.15", + "react": "^16.7.0 || ^17 || ^18 || ^19", + "react-dom": "^16.7.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/@fullcalendar/timegrid": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.15.tgz", + "integrity": "sha512-61ORr3A148RtxQ2FNG7JKvacyA/TEVZ7z6I+3E9Oeu3dqTf6M928bFcpehRTIK6zIA6Yifs7BeWHgOE9dFnpbw==", + "license": "MIT", + "dependencies": { + "@fullcalendar/daygrid": "~6.1.15" + }, + "peerDependencies": { + "@fullcalendar/core": "~6.1.15" + } + }, + "node_modules/@hookform/resolvers": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.1.tgz", + "integrity": "sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==", + "license": "MIT", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "Apache-2.0", + "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==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@iconify/json": { + "version": "2.2.286", + "resolved": "https://registry.npmjs.org/@iconify/json/-/json-2.2.286.tgz", + "integrity": "sha512-tVl/fYvCyU5flYl4zfuJgig+ZEnpG3DJdTTTIjsiPu7xsk4s0gT1BktWvcFGr2B4UUiTRdb+XHWzW8Eu9WwhKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@iconify/types": "*", + "pathe": "^1.1.2" + } + }, + "node_modules/@iconify/tools": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@iconify/tools/-/tools-4.1.1.tgz", + "integrity": "sha512-Hybu/HGhv6T8nLQhiG9rKx+ekF7NNpPOEQAy7JRSKht3s3dcFSsPccYzk24Znc9MTxrR6Gak3cg6CPP5dyvS2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0", + "@iconify/utils": "^2.2.0", + "@types/tar": "^6.1.13", + "axios": "^1.7.9", + "cheerio": "1.0.0", + "domhandler": "^5.0.3", + "extract-zip": "^2.0.1", + "local-pkg": "^0.5.1", + "pathe": "^1.1.2", + "svgo": "^3.3.2", + "tar": "^6.2.1" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.1.tgz", + "integrity": "sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^0.4.1", + "@antfu/utils": "^0.7.10", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.13.0", + "kolorist": "^1.8.0", + "local-pkg": "^0.5.1", + "mlly": "^1.7.3" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "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, + "license": "ISC", + "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.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-3.0.0.tgz", + "integrity": "sha512-2XghOwu16ZwPJLOFVuIOaLbN0iKMn867evzXFyf0P22dqugezfJwLmdanAgU25ITvz1TvOfVP4jsDImlDJzcWg==", + "license": "BSD-3-Clause" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "19.3.3", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.3.tgz", + "integrity": "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.1", + "json-stringify-pretty-compact": "^3.0.0", + "minimist": "^1.2.8", + "rw": "^1.3.3", + "sort-object": "^3.0.3" + }, + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.66", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.66.tgz", + "integrity": "sha512-1SzcNbtIms0o/Dx+599B6QbvR5qUMBUjwc2Gs47h1HsF7RcEFXxqaq7zrWkIWbvGctIIPx0j330oGx/SkF+UmA==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@floating-ui/react-dom": "^2.1.1", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.2.0", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.5.0.tgz", + "integrity": "sha512-LGb8t8i6M2ZtS3Drn3GbTI1DVhDY6FJ9crEey2lZ0aN2EMZo8IZBZj9wRf4vqbZHaWjsYgtbOnJw5V8UWbmK2Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/lab": { + "version": "6.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.19.tgz", + "integrity": "sha512-t7iub8kjpLdA5uDGwGnNRjtGc1vYEUnDwSROjKrnYqjOlCQhBajFa8uoQtaST6jE/VEk6cxpDMnN5MalC6YpCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/base": "5.0.0-beta.66", + "@mui/system": "^6.2.0", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.2.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^6.2.0", + "@mui/material-pigment-css": "^6.2.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.2.1.tgz", + "integrity": "sha512-7VlKGsRKsy1bOSOPaSNgpkzaL+0C7iWAVKd2KYyAvhR9fTLJtiAMpq+KuzgEh1so2mtvQERN0tZVIceWMiIesw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.2.1", + "@mui/system": "^6.2.1", + "@mui/types": "^7.2.20", + "@mui/utils": "^6.2.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.2.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material-nextjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@mui/material-nextjs/-/material-nextjs-6.2.1.tgz", + "integrity": "sha512-PiCsm5YVbWi+SgIAXvJidfX0m++Sri0aJiLe8cJZKnYoBCl7MT2mW/f73KmrNaFy1TmeXPKTg7EKu9f48o0eFg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.4", + "@emotion/server": "^11.11.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "next": "^13.0.0 || ^14.0.0 || ^15.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/cache": { + "optional": true + }, + "@emotion/server": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.9.tgz", + "integrity": "sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.9", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.5.0.tgz", + "integrity": "sha512-8woC2zAqF4qUDSPIBZ8v3sakj+WgweolpyM/FXf8jAx6FMls+IE4Y8VDZc+zS805J7PRz31vz73n2SovKGaYgw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.5.0.tgz", + "integrity": "sha512-XcbBYxDS+h/lgsoGe78ExXFZXtuIlSBpn/KsZq8PtZcIkUNJInkuDqcLd2rVBQrDC1u+rvVovdaWPf2FHKJf3w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.9", + "@mui/styled-engine": "^6.5.0", + "@mui/types": "~7.2.24", + "@mui/utils": "^6.4.9", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz", + "integrity": "sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.9.tgz", + "integrity": "sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/types": "~7.2.24", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/@mui/types": { + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.2.tgz", + "integrity": "sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.2.tgz", + "integrity": "sha512-sgfw3+WdaYOGPKCvM1L+UucBmRfh8V2Ygefp7ELON0+0vY7uohQwXXnVWg3rY7mXDKharQR3o7uedpfvnU2hlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.2.tgz", + "integrity": "sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.2.tgz", + "integrity": "sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.2.tgz", + "integrity": "sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.2.tgz", + "integrity": "sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.2.tgz", + "integrity": "sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.2.tgz", + "integrity": "sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.2.tgz", + "integrity": "sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.2.tgz", + "integrity": "sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "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, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", + "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", + "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.0.tgz", + "integrity": "sha512-awNe2oTodsZ6LmRqmkFhtb/KH03hUhxOamEQy411m3Njj3BbFvoBovxo4Q1cBWnV1ErprVj9MlF0UPXkng0eyg==", + "license": "MIT", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", + "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.83.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.1.tgz", + "integrity": "sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.84.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.84.0.tgz", + "integrity": "sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.84.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.84.1.tgz", + "integrity": "sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.83.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.84.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.84.1.tgz", + "integrity": "sha512-nle+OQ9B3Z3EG2R3ixvaNcJ6OeqGwmAc5iMDW6Vj+emLZkWRrN3BDsrzZQu414n34lpxplnC7z1jmKuU/scHCQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.84.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.84.1", + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", + "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tiptap/core": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.26.1.tgz", + "integrity": "sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.26.1.tgz", + "integrity": "sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.26.1.tgz", + "integrity": "sha512-zCce9PRuTNhadFir71luLo99HERDpGJ0EEflGm7RN8I1SnNi9gD5ooK42BOIQtejGCJqg3hTPZiYDJC2hXvckQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.1.tgz", + "integrity": "sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q==", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.1.tgz", + "integrity": "sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.26.1.tgz", + "integrity": "sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.26.1.tgz", + "integrity": "sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-color": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.26.1.tgz", + "integrity": "sha512-lsPw3qpQNes1rHpxBtsV9XniN1dEjYd2nVTpQHGE4XLNwfE5+ejm6ySs8qVLM7+EXWcjANLLh4UA3zqkX6t6HA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.26.1.tgz", + "integrity": "sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.1.tgz", + "integrity": "sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.1.tgz", + "integrity": "sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w==", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.1.tgz", + "integrity": "sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.26.1.tgz", + "integrity": "sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.26.1.tgz", + "integrity": "sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.26.1.tgz", + "integrity": "sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.1.tgz", + "integrity": "sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.26.1.tgz", + "integrity": "sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.26.1.tgz", + "integrity": "sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.1.tgz", + "integrity": "sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.26.1.tgz", + "integrity": "sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.26.1.tgz", + "integrity": "sha512-MBlqbkd+63btY7Qu+SqrXvWjPwooGZDsLTtl7jp52BczBl61cq9yygglt9XpM11TFMBdySgdLHBrLtQ0B7fBlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.26.1.tgz", + "integrity": "sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.26.1.tgz", + "integrity": "sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-align": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.26.1.tgz", + "integrity": "sha512-x6mpNGELy2QtSPBoQqNgiXO9PjZoB+O2EAfXA9YRiBDSIRNOrw+7vOVpi+IgzswFmhMNgIYUVfQRud4FHUCNew==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-style": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.26.1.tgz", + "integrity": "sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.26.1.tgz", + "integrity": "sha512-/fufv41WDMdf0a4xmFAxONoAz08TonJXX6NEoSJmuGKO59M/Y0Pz8DTK1g32Wk44kn7dyScDiPlvvndl+UOv0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.26.1.tgz", + "integrity": "sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.1", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.23.0", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.26.1.tgz", + "integrity": "sha512-Zxlwzi1iML7aELa+PyysFD2ncVo2mEcjTkhoDok9iTbMGpm1oU8hgR1i6iHrcSNQLfaRiW6M7HNhZZQPKIC9yw==", + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.26.1", + "@tiptap/extension-floating-menu": "^2.26.1", + "@types/use-sync-external-store": "^0.0.6", + "fast-deep-equal": "^3", + "use-sync-external-store": "^1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.26.1.tgz", + "integrity": "sha512-oziMGCds8SVQ3s5dRpBxVdEKZAmO/O//BjZ69mhA3q4vJdR0rnfLb5fTxSeQvHiqB878HBNn76kNaJrHrV35GA==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.26.1", + "@tiptap/extension-blockquote": "^2.26.1", + "@tiptap/extension-bold": "^2.26.1", + "@tiptap/extension-bullet-list": "^2.26.1", + "@tiptap/extension-code": "^2.26.1", + "@tiptap/extension-code-block": "^2.26.1", + "@tiptap/extension-document": "^2.26.1", + "@tiptap/extension-dropcursor": "^2.26.1", + "@tiptap/extension-gapcursor": "^2.26.1", + "@tiptap/extension-hard-break": "^2.26.1", + "@tiptap/extension-heading": "^2.26.1", + "@tiptap/extension-history": "^2.26.1", + "@tiptap/extension-horizontal-rule": "^2.26.1", + "@tiptap/extension-italic": "^2.26.1", + "@tiptap/extension-list-item": "^2.26.1", + "@tiptap/extension-ordered-list": "^2.26.1", + "@tiptap/extension-paragraph": "^2.26.1", + "@tiptap/extension-strike": "^2.26.1", + "@tiptap/extension-text": "^2.26.1", + "@tiptap/extension-text-style": "^2.26.1", + "@tiptap/pm": "^2.26.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/geojson-vt": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "license": "MIT" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "node_modules/@types/mapbox-gl": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-3.4.1.tgz", + "integrity": "sha512-NsGKKtgW93B+UaLPti6B7NwlxYlES5DpV5Gzj9F75rK5ALKsqSk15CiEHbOnTr09RGbr6ZYiCdI+59NNNcAImg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@types/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@types/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-elf6BsTq+AkyNsb2h5cGNst2Mc7dPliVoAPm1fXglC/BM3f2pFA40BaSSv3E5lyHteEawVKLP+8TwiY1DMNb3A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz", + "integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/pbf": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.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.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "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/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", + "license": "MIT" + }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apexcharts": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.49.0.tgz", + "integrity": "sha512-2T9HnbQFLCuYRPndQLmh+bEQFoz0meUbvASaGgiSKDuYhWcLBodJtIpKql2aOtMx4B/sHrWW0dm90HsW4+h2PQ==", + "license": "MIT", + "dependencies": { + "@yr/monotone-cubic-spline": "^1.0.3", + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "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, + "license": "MIT" + }, + "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==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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, + "license": "MIT", + "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.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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/bytewise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "license": "MIT", + "dependencies": { + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" + } + }, + "node_modules/bytewise-core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "license": "MIT", + "dependencies": { + "typewise-core": "^1.2" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "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, + "license": "MIT", + "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/cheap-ruler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-4.0.0.tgz", + "integrity": "sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw==", + "license": "ISC" + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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, + "license": "MIT", + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz", + "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.0", + "use-sync-external-store": "^1.2.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "devOptional": true, + "license": "MIT", + "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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "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, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.3.0.tgz", + "integrity": "sha512-kxltocVQCwQNFvw40dlVRYeAkAvtYjMFZYNlOcsF5wExPpGwPxMwgx4IfDJvBRPtBpnQwItd5WkTaR0ZwT/TmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" + }, + "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, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssjanus": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz", + "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "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, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/earcut": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", + "license": "ISC" + }, + "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, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.194", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", + "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-mart": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", + "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@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": "15.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.2.tgz", + "integrity": "sha512-PrMm1/4zWSJ689wd/ypWIR5ZF1uvmp3EkgpgBV1Yu6PhEobBjXMGgT8bVNelwl17LXojO8D5ePFRiI4qXjsPRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.1.2", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/eslint-import-resolver-typescript/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "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.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "license": "MIT", + "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, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT", + "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, + "license": "ISC", + "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, + "license": "BSD-2-Clause", + "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "BSD-2-Clause", + "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.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "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, + "license": "ISC", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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/flat-cache/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "ISC" + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "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, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/geojson-vt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/globby/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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==", + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "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, + "license": "MIT", + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "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, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, + "node_modules/input-otp": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.1.tgz", + "integrity": "sha512-+yvpmKYKHi9jIGngxagY9oWiiblPB7+nEO75F2l2o4vs+6vpPZZmUl4tBNYuTCvQjhvEIbdNeJu70bhfYP2nbw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "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, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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, + "license": "MIT", + "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/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" + }, + "node_modules/keen-slider": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/keen-slider/-/keen-slider-6.8.6.tgz", + "integrity": "sha512-dcEQ7GDBpCjUQA8XZeWh3oBBLLmyn8aoeIQFGL/NTVkoEOsmlnXqA4QykUm/SncolAZYGsEk/PfUhLZ7mwMM2w==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/mapbox-gl": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.9.0.tgz", + "integrity": "sha512-QKAxLHcbdoqobXuhu2PP6HJDSy0/GhfZuO5O8BrmwfR0ihZbA5ihYD/u0wGqu2QTDWi/DbgCWJIlV2mXh2Sekg==", + "license": "SEE LICENSE IN LICENSE.txt", + "workspaces": [ + "src/style-spec", + "test/build/typings" + ], + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^3.0.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.6", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@types/geojson": "^7946.0.15", + "@types/geojson-vt": "^3.2.5", + "@types/mapbox__point-geometry": "^0.1.4", + "@types/mapbox__vector-tile": "^1.3.4", + "@types/pbf": "^3.0.5", + "@types/supercluster": "^7.1.3", + "cheap-ruler": "^4.0.0", + "csscolorparser": "~1.0.3", + "earcut": "^3.0.0", + "geojson-vt": "^4.0.2", + "gl-matrix": "^3.4.3", + "grid-index": "^1.1.0", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^2.0.0", + "quickselect": "^3.0.0", + "serialize-to-js": "^3.1.2", + "supercluster": "^8.0.1", + "tinyqueue": "^3.0.0", + "vt-pbf": "^3.1.3" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nano-css": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", + "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", + "license": "Unlicense", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "css-tree": "^1.1.2", + "csstype": "^3.1.2", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^7.0.1", + "rtl-css-js": "^1.16.1", + "stacktrace-js": "^2.0.2", + "stylis": "^4.3.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.2.tgz", + "integrity": "sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.1.2", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.1.2", + "@next/swc-darwin-x64": "15.1.2", + "@next/swc-linux-arm64-gnu": "15.1.2", + "@next/swc-linux-arm64-musl": "15.1.2", + "@next/swc-linux-x64-gnu": "15.1.2", + "@next/swc-linux-x64-musl": "15.1.2", + "@next/swc-win32-arm64-msvc": "15.1.2", + "@next/swc-win32-x64-msvc": "15.1.2", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "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, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pbf": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-styled-syntax": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/postcss-styled-syntax/-/postcss-styled-syntax-0.7.0.tgz", + "integrity": "sha512-OeStzPkHJ1/WDGRKm/JuVK8UdJbjt3U7AFC+zUc9omJ79SaXSxWoy+PXxJz7t8vOO8HcUgCLndNEQfLvZ74TuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "typescript": "^5.6.3" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-styled-syntax/node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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, + "license": "MIT" + }, + "node_modules/potpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/prosemirror-changeset": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", + "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz", + "integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", + "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", + "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.2.tgz", + "integrity": "sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q==", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", + "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz", + "integrity": "sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.25.0", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.3", + "prosemirror-view": "^1.39.1" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz", + "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.40.1.tgz", + "integrity": "sha512-pbwUjt3G7TlsQQHDiYSupWBhJswpLVB09xXm1YiJPdkjkh9Pe7Y51XdLh5VWIZmROLY8UpUpG03lkdhm9lzIBA==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.1.tgz", + "integrity": "sha512-G14nVaD64Bnbgy8tYxkjuXEUp/7h30Q0U33xc3AwtGFijJB9nHqOt1a6eG0WBn055RgRg+NwqbKGtqPxy15d0Q==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "apexcharts": "^3.41.0", + "react": ">=0.13" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-datepicker": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.3.0.tgz", + "integrity": "sha512-EqRKLAtLZUTztiq6a+tjSjQX9ES0Xd229JPckAtyZZ4GoY3rtvNWAzkYZnQUf6zTWT50Ki0+t+W9VRQIkSJLfg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.2", + "clsx": "^2.1.0", + "date-fns": "^3.3.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.13.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-datepicker/node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-datepicker/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-hook-form": { + "version": "7.54.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.1.tgz", + "integrity": "sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", + "license": "MIT" + }, + "node_modules/react-map-gl": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-7.1.8.tgz", + "integrity": "sha512-zwF16XMOdOKH4py5ehS1bgQIChqW8UN3b1bXps+JnADbYLSbOoUPQ3tNw0EZ2OTBWArR5aaQlhlEqg4lE47T8A==", + "license": "MIT", + "dependencies": { + "@maplibre/maplibre-gl-style-spec": "^19.2.1", + "@types/mapbox-gl": ">=1.0.0" + }, + "peerDependencies": { + "mapbox-gl": ">=1.13.0", + "maplibre-gl": ">=1.13.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "mapbox-gl": { + "optional": true + }, + "maplibre-gl": { + "optional": true + } + } + }, + "node_modules/react-onclickoutside": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.2.tgz", + "integrity": "sha512-h6Hbf1c8b7tIYY4u90mDdBLY4+AGQVMFtIE89HgC0DtVCh/JfKl477gYqUtGLmjZBKK3MJxomP/lFiLbz4sq9A==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-perfect-scrollbar": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz", + "integrity": "sha512-bQ46m70gp/HJtiBOF3gRzBISSZn8FFGNxznTdmTG8AAwpxG1bJCyn7shrgjEvGSQ5FJEafVEiosY+ccER11OSA==", + "license": "MIT", + "dependencies": { + "perfect-scrollbar": "^1.5.0", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": ">=16.3.3", + "react-dom": ">=16.3.3" + } + }, + "node_modules/react-player": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.16.0.tgz", + "integrity": "sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.0.0", + "load-script": "^1.0.0", + "memoize-one": "^5.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.0.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-toastify": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.6.tgz", + "integrity": "sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/react-use": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.0.tgz", + "integrity": "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==", + "license": "Unlicense", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.6.2", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.0.tgz", + "integrity": "sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.0", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT", + "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, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-to-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.2.tgz", + "integrity": "sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "license": "Unlicense", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sort-asc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "license": "MIT", + "dependencies": { + "bytewise": "^1.1.0", + "get-value": "^2.0.2", + "is-extendable": "^0.1.1", + "sort-asc": "^0.2.0", + "sort-desc": "^0.2.0", + "union-value": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylelint": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz", + "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.1.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-use-logical-spec": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz", + "integrity": "sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA==", + "dev": true, + "license": "CC0-1.0", + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "stylelint": ">=11 < 17" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/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, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stylelint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "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/stylelint/node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "license": "MIT" + }, + "node_modules/stylis-plugin-rtl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz", + "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssjanus": "^2.0.1" + }, + "peerDependencies": { + "stylis": "4.x" + } + }, + "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, + "license": "MIT", + "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/sucrase/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, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "license": "MIT", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==", + "license": "MIT" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "license": "MIT", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/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, + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-logical": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tailwindcss-logical/-/tailwindcss-logical-3.0.1.tgz", + "integrity": "sha512-mv585RJfzS/Cu9Rpl2M5H+JSOdU3qjLHzKMtg63oD5lXfehRJpldbEqll20Obvlexq0Cmyg86l7cmb/I5hEutg==", + "dev": true, + "license": "ISC", + "dependencies": { + "tailwindcss": "3.3.1" + } + }, + "node_modules/tailwindcss-logical/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, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss-logical/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, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss-logical/node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/tailwindcss-logical/node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss-logical/node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/tailwindcss-logical/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss-logical/node_modules/tailwindcss": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", + "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.17.2", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1", + "sucrase": "^3.29.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/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, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/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" + } + ], + "license": "MIT", + "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/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", + "license": "Unlicense" + }, + "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, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "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, + "license": "MIT", + "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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typewise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "license": "MIT", + "dependencies": { + "typewise-core": "^1.2.0" + } + }, + "node_modules/typewise-core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==", + "license": "MIT" + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.21.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", + "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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, + "license": "MIT" + }, + "node_modules/valibot": { + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.42.1.tgz", + "integrity": "sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "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, + "license": "MIT", + "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "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.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..314b9c6 --- /dev/null +++ b/package.json @@ -0,0 +1,116 @@ +{ + "name": "vuexy-mui-nextjs-admin-template", + "version": "4.0.0", + "license": "Commercial", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint", + "lint:fix": "next lint --fix", + "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"", + "build:icons": "tsx src/assets/iconify-icons/bundle-icons-css.ts", + "removeI18n": "tsx src/remove-translation-scripts/index.ts" + }, + "dependencies": { + "@emoji-mart/data": "1.2.1", + "@emoji-mart/react": "1.1.1", + "@emotion/cache": "11.14.0", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", + "@floating-ui/react": "0.27.2", + "@formatjs/intl-localematcher": "0.5.9", + "@formkit/drag-and-drop": "0.2.6", + "@fullcalendar/common": "5.11.5", + "@fullcalendar/core": "6.1.15", + "@fullcalendar/daygrid": "6.1.15", + "@fullcalendar/interaction": "6.1.15", + "@fullcalendar/list": "6.1.15", + "@fullcalendar/react": "6.1.15", + "@fullcalendar/timegrid": "6.1.15", + "@hookform/resolvers": "3.9.1", + "@mui/lab": "6.0.0-beta.19", + "@mui/material": "6.2.1", + "@mui/material-nextjs": "6.2.1", + "@reduxjs/toolkit": "2.5.0", + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-query": "^5.84.1", + "@tanstack/react-query-devtools": "^5.84.1", + "@tanstack/react-table": "8.20.6", + "@tiptap/extension-color": "^2.10.4", + "@tiptap/extension-list-item": "^2.10.4", + "@tiptap/extension-placeholder": "^2.10.4", + "@tiptap/extension-text-align": "^2.10.4", + "@tiptap/extension-text-style": "^2.10.4", + "@tiptap/extension-underline": "^2.10.4", + "@tiptap/pm": "^2.10.4", + "@tiptap/react": "^2.10.4", + "@tiptap/starter-kit": "^2.10.4", + "apexcharts": "3.49.0", + "axios": "^1.11.0", + "bootstrap-icons": "1.11.3", + "classnames": "2.5.1", + "cmdk": "1.0.4", + "date-fns": "4.1.0", + "emoji-mart": "5.6.0", + "fs-extra": "11.2.0", + "input-otp": "1.4.1", + "keen-slider": "6.8.6", + "mapbox-gl": "3.9.0", + "negotiator": "1.0.0", + "next": "15.1.2", + "react": "18.3.1", + "react-apexcharts": "1.4.1", + "react-colorful": "5.6.1", + "react-datepicker": "7.3.0", + "react-dom": "18.3.1", + "react-dropzone": "14.3.5", + "react-hook-form": "7.54.1", + "react-map-gl": "7.1.8", + "react-perfect-scrollbar": "1.5.8", + "react-player": "2.16.0", + "react-redux": "9.2.0", + "react-toastify": "10.0.6", + "react-use": "17.6.0", + "recharts": "2.15.0", + "valibot": "0.42.1" + }, + "devDependencies": { + "@iconify/json": "2.2.286", + "@iconify/tools": "4.1.1", + "@iconify/types": "2.0.0", + "@iconify/utils": "2.2.1", + "@types/fs-extra": "^11.0.4", + "@types/mapbox-gl": "^3.4.1", + "@types/negotiator": "^0.6.3", + "@types/node": "^22.10.2", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "7.18.0", + "@typescript-eslint/parser": "7.18.0", + "autoprefixer": "10.4.20", + "consola": "3.3.0", + "eslint": "8.57.1", + "eslint-config-next": "15.1.2", + "eslint-config-prettier": "9.1.0", + "eslint-import-resolver-typescript": "3.7.0", + "eslint-plugin-import": "2.31.0", + "globby": "14.0.2", + "postcss": "8.4.49", + "postcss-styled-syntax": "0.7.0", + "prettier": "3.4.2", + "stylelint": "16.12.0", + "stylelint-use-logical-spec": "5.0.1", + "stylis": "4.3.4", + "stylis-plugin-rtl": "2.1.1", + "tailwindcss": "3.4.17", + "tailwindcss-logical": "3.0.1", + "tsx": "4.19.2", + "typescript": "5.5.4" + }, + "resolutions": { + "rimraf": "^5.0.7", + "@tiptap/core": "^2.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..45cb739 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8663 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + rimraf: ^5.0.7 + '@tiptap/core': ^2.0.0 + +importers: + + .: + dependencies: + '@auth/prisma-adapter': + specifier: 2.7.4 + version: 2.7.4(@prisma/client@5.22.0(prisma@5.22.0)) + '@emoji-mart/data': + specifier: 1.2.1 + version: 1.2.1 + '@emoji-mart/react': + specifier: 1.1.1 + version: 1.1.1(emoji-mart@5.6.0)(react@18.3.1) + '@emotion/cache': + specifier: 11.14.0 + version: 11.14.0 + '@emotion/react': + specifier: 11.14.0 + version: 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': + specifier: 11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@floating-ui/react': + specifier: 0.27.2 + version: 0.27.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@formatjs/intl-localematcher': + specifier: 0.5.9 + version: 0.5.9 + '@formkit/drag-and-drop': + specifier: 0.2.6 + version: 0.2.6 + '@fullcalendar/common': + specifier: 5.11.5 + version: 5.11.5 + '@fullcalendar/core': + specifier: 6.1.15 + version: 6.1.15 + '@fullcalendar/daygrid': + specifier: 6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@fullcalendar/interaction': + specifier: 6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@fullcalendar/list': + specifier: 6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@fullcalendar/react': + specifier: 6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@fullcalendar/timegrid': + specifier: 6.1.15 + version: 6.1.15(@fullcalendar/core@6.1.15) + '@hookform/resolvers': + specifier: 3.9.1 + version: 3.9.1(react-hook-form@7.54.1(react@18.3.1)) + '@mui/lab': + specifier: 6.0.0-beta.19 + version: 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@mui/material@6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': + specifier: 6.2.1 + version: 6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material-nextjs': + specifier: 6.2.1 + version: 6.2.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(next@15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@prisma/client': + specifier: 5.22.0 + version: 5.22.0(prisma@5.22.0) + '@reduxjs/toolkit': + specifier: 2.5.0 + version: 2.5.0(react-redux@9.2.0(@types/react@18.3.18)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + '@tanstack/match-sorter-utils': + specifier: 8.19.4 + version: 8.19.4 + '@tanstack/react-table': + specifier: 8.20.6 + version: 8.20.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/extension-color': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))) + '@tiptap/extension-list-item': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-placeholder': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-text-align': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-text-style': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-underline': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/pm': + specifier: ^2.10.4 + version: 2.10.4 + '@tiptap/react': + specifier: ^2.10.4 + version: 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/starter-kit': + specifier: ^2.10.4 + version: 2.10.4 + apexcharts: + specifier: 3.49.0 + version: 3.49.0 + bootstrap-icons: + specifier: 1.11.3 + version: 1.11.3 + classnames: + specifier: 2.5.1 + version: 2.5.1 + cmdk: + specifier: 1.0.4 + version: 1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + date-fns: + specifier: 4.1.0 + version: 4.1.0 + emoji-mart: + specifier: 5.6.0 + version: 5.6.0 + fs-extra: + specifier: 11.2.0 + version: 11.2.0 + input-otp: + specifier: 1.4.1 + version: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + keen-slider: + specifier: 6.8.6 + version: 6.8.6 + mapbox-gl: + specifier: 3.9.0 + version: 3.9.0 + negotiator: + specifier: 1.0.0 + version: 1.0.0 + next: + specifier: 15.1.2 + version: 15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: 4.24.11 + version: 4.24.11(next@15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: 18.3.1 + version: 18.3.1 + react-apexcharts: + specifier: 1.4.1 + version: 1.4.1(apexcharts@3.49.0)(react@18.3.1) + react-colorful: + specifier: 5.6.1 + version: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-datepicker: + specifier: 7.3.0 + version: 7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + react-dropzone: + specifier: 14.3.5 + version: 14.3.5(react@18.3.1) + react-hook-form: + specifier: 7.54.1 + version: 7.54.1(react@18.3.1) + react-map-gl: + specifier: 7.1.8 + version: 7.1.8(mapbox-gl@3.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-perfect-scrollbar: + specifier: 1.5.8 + version: 1.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-player: + specifier: 2.16.0 + version: 2.16.0(react@18.3.1) + react-redux: + specifier: 9.2.0 + version: 9.2.0(@types/react@18.3.18)(react@18.3.1)(redux@5.0.1) + react-toastify: + specifier: 10.0.6 + version: 10.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use: + specifier: 17.6.0 + version: 17.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + recharts: + specifier: 2.15.0 + version: 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + server-only: + specifier: 0.0.1 + version: 0.0.1 + valibot: + specifier: 0.42.1 + version: 0.42.1(typescript@5.5.4) + devDependencies: + '@iconify/json': + specifier: 2.2.286 + version: 2.2.286 + '@iconify/tools': + specifier: 4.1.1 + version: 4.1.1 + '@iconify/types': + specifier: 2.0.0 + version: 2.0.0 + '@iconify/utils': + specifier: 2.2.1 + version: 2.2.1 + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/mapbox-gl': + specifier: ^3.4.1 + version: 3.4.1 + '@types/negotiator': + specifier: ^0.6.3 + version: 0.6.3 + '@types/node': + specifier: ^22.10.2 + version: 22.10.2 + '@types/react': + specifier: ^18.3.18 + version: 18.3.18 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.18) + '@typescript-eslint/eslint-plugin': + specifier: 7.18.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: 7.18.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) + autoprefixer: + specifier: 10.4.20 + version: 10.4.20(postcss@8.4.49) + consola: + specifier: 3.3.0 + version: 3.3.0 + dotenv-cli: + specifier: 7.4.4 + version: 7.4.4 + eslint: + specifier: 8.57.1 + version: 8.57.1 + eslint-config-next: + specifier: 15.1.2 + version: 15.1.2(eslint@8.57.1)(typescript@5.5.4) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.1) + eslint-import-resolver-typescript: + specifier: 3.7.0 + version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: + specifier: 2.31.0 + version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + globby: + specifier: 14.0.2 + version: 14.0.2 + postcss: + specifier: 8.4.49 + version: 8.4.49 + postcss-styled-syntax: + specifier: 0.7.0 + version: 0.7.0(postcss@8.4.49) + prettier: + specifier: 3.4.2 + version: 3.4.2 + prisma: + specifier: 5.22.0 + version: 5.22.0 + stylelint: + specifier: 16.12.0 + version: 16.12.0(typescript@5.5.4) + stylelint-use-logical-spec: + specifier: 5.0.1 + version: 5.0.1(stylelint@16.12.0(typescript@5.5.4)) + stylis: + specifier: 4.3.4 + version: 4.3.4 + stylis-plugin-rtl: + specifier: 2.1.1 + version: 2.1.1(stylis@4.3.4) + tailwindcss: + specifier: 3.4.17 + version: 3.4.17 + tailwindcss-logical: + specifier: 3.0.1 + version: 3.0.1(postcss@8.4.49) + tsx: + specifier: 4.19.2 + version: 4.19.2 + typescript: + specifier: 5.5.4 + version: 5.5.4 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@auth/core@0.37.4': + resolution: {integrity: sha512-HOXJwXWXQRhbBDHlMU0K/6FT1v+wjtzdKhsNg0ZN7/gne6XPsIrjZ4daMcFnbq0Z/vsAbYBinQhhua0d77v7qw==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + '@auth/prisma-adapter@2.7.4': + resolution: {integrity: sha512-3T/X94R9J1sxOLQtsD3ijIZ0JGHPXlZQxRr/8NpnZBJ3KGxun/mNsZ1MwMRhTxy0mmn9JWXk7u9+xCcVn0pu3A==} + peerDependencies: + '@prisma/client': '>=2.26.0 || >=3 || >=4 || >=5' + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.2': + resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + + '@emoji-mart/data@1.2.1': + resolution: {integrity: sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==} + + '@emoji-mart/react@1.1.1': + resolution: {integrity: sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==} + peerDependencies: + emoji-mart: ^5.2 + react: ^16.8 || ^17 || ^18 + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.2': + resolution: {integrity: sha512-k/yP6a9K9QwhLfIu87iUZxCH6XN5z5j/VUHHq0dEnbZYY2Y9jz68E/LXFtK8dkiaYltS2WYohnyKC0VcwVneVg==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@formatjs/intl-localematcher@0.5.9': + resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} + + '@formkit/drag-and-drop@0.2.6': + resolution: {integrity: sha512-yBRe5beAIRunguj/XrkW1Q1yiAG8qXyREHnn3H1osCGNUwQ/pLxQk9jbYvMGn+0/vnwa4N/he1MIteLG2GWbdQ==} + + '@fullcalendar/common@5.11.5': + resolution: {integrity: sha512-3iAYiUbHXhjSVXnYWz27Od2cslztUPsOwiwKlfGvQxBixv2Kl6a8IPwaijKFYJHXdwYmfPoEgK7rvqAGVoIYwA==} + + '@fullcalendar/core@6.1.15': + resolution: {integrity: sha512-BuX7o6ALpLb84cMw1FCB9/cSgF4JbVO894cjJZ6kP74jzbUZNjtwffwRdA+Id8rrLjT30d/7TrkW90k4zbXB5Q==} + + '@fullcalendar/daygrid@6.1.15': + resolution: {integrity: sha512-j8tL0HhfiVsdtOCLfzK2J0RtSkiad3BYYemwQKq512cx6btz6ZZ2RNc/hVnIxluuWFyvx5sXZwoeTJsFSFTEFA==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullcalendar/interaction@6.1.15': + resolution: {integrity: sha512-DOTSkofizM7QItjgu7W68TvKKvN9PSEEvDJceyMbQDvlXHa7pm/WAVtAc6xSDZ9xmB1QramYoWGLHkCYbTW1rQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullcalendar/list@6.1.15': + resolution: {integrity: sha512-U1bce04tYDwkFnuVImJSy2XalYIIQr6YusOWRPM/5ivHcJh67Gm8CIMSWpi3KdRSNKFkqBxLPkfZGBMaOcJYug==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@fullcalendar/react@6.1.15': + resolution: {integrity: sha512-L0b9hybS2J4e7lq6G2CD4nqriyLEqOH1tE8iI6JQjAMTVh5JicOo5Mqw+fhU5bJ7hLfMw2K3fksxX3Ul1ssw5w==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + react: ^16.7.0 || ^17 || ^18 || ^19 + react-dom: ^16.7.0 || ^17 || ^18 || ^19 + + '@fullcalendar/timegrid@6.1.15': + resolution: {integrity: sha512-61ORr3A148RtxQ2FNG7JKvacyA/TEVZ7z6I+3E9Oeu3dqTf6M928bFcpehRTIK6zIA6Yifs7BeWHgOE9dFnpbw==} + peerDependencies: + '@fullcalendar/core': ~6.1.15 + + '@hookform/resolvers@3.9.1': + resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@iconify/json@2.2.286': + resolution: {integrity: sha512-tVl/fYvCyU5flYl4zfuJgig+ZEnpG3DJdTTTIjsiPu7xsk4s0gT1BktWvcFGr2B4UUiTRdb+XHWzW8Eu9WwhKQ==} + + '@iconify/tools@4.1.1': + resolution: {integrity: sha512-Hybu/HGhv6T8nLQhiG9rKx+ekF7NNpPOEQAy7JRSKht3s3dcFSsPccYzk24Znc9MTxrR6Gak3cg6CPP5dyvS2Q==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.2.1': + resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mapbox/jsonlint-lines-primitives@2.0.2': + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + + '@mapbox/mapbox-gl-supported@3.0.0': + resolution: {integrity: sha512-2XghOwu16ZwPJLOFVuIOaLbN0iKMn867evzXFyf0P22dqugezfJwLmdanAgU25ITvz1TvOfVP4jsDImlDJzcWg==} + + '@mapbox/point-geometry@0.1.0': + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + + '@mapbox/tiny-sdf@2.0.6': + resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/vector-tile@1.3.1': + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@maplibre/maplibre-gl-style-spec@19.3.3': + resolution: {integrity: sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==} + hasBin: true + + '@mui/base@5.0.0-beta.66': + resolution: {integrity: sha512-1SzcNbtIms0o/Dx+599B6QbvR5qUMBUjwc2Gs47h1HsF7RcEFXxqaq7zrWkIWbvGctIIPx0j330oGx/SkF+UmA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@6.2.1': + resolution: {integrity: sha512-U/8vS1+1XiHBnnRRESSG1gvr6JDHdPjrpnW6KEebkAQWBn6wrpbSF/XSZ8/vJIRXH5NyDmMHi4Ro5Q70//JKhA==} + + '@mui/lab@6.0.0-beta.19': + resolution: {integrity: sha512-t7iub8kjpLdA5uDGwGnNRjtGc1vYEUnDwSROjKrnYqjOlCQhBajFa8uoQtaST6jE/VEk6cxpDMnN5MalC6YpCg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': ^6.2.0 + '@mui/material-pigment-css': ^6.2.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/material-nextjs@6.2.1': + resolution: {integrity: sha512-PiCsm5YVbWi+SgIAXvJidfX0m++Sri0aJiLe8cJZKnYoBCl7MT2mW/f73KmrNaFy1TmeXPKTg7EKu9f48o0eFg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/cache': ^11.11.0 + '@emotion/react': ^11.11.4 + '@emotion/server': ^11.11.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + next: ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/cache': + optional: true + '@emotion/server': + optional: true + '@types/react': + optional: true + + '@mui/material@6.2.1': + resolution: {integrity: sha512-7VlKGsRKsy1bOSOPaSNgpkzaL+0C7iWAVKd2KYyAvhR9fTLJtiAMpq+KuzgEh1so2mtvQERN0tZVIceWMiIesw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material-pigment-css': ^6.2.1 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@6.2.1': + resolution: {integrity: sha512-u1y0gpcfrRRxCcIdVeU5eIvkinA82Q8ft178WUNYuoFQrsOrXdlBdZlRVi+eYuUFp1iXI55Cud7sMZZtETix5Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@6.2.1': + resolution: {integrity: sha512-6R3OgYw6zgCZWFYYMfxDqpGfJA78mUTOIlUDmmJlr60ogVNCrM87X0pqx5TbZ2OwUyxlJxN9qFgRr+J9H6cOBg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@6.2.1': + resolution: {integrity: sha512-0lc8CbBP4WAAF+SmGMFJI9bpIyQvW3zvwIDzLsb26FIB/4Z0pO7qGe8mkAl0RM63Vb37899qxnThhHKgAAdy6w==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.20': + resolution: {integrity: sha512-straFHD7L8v05l/N5vcWk+y7eL9JF0C2mtph/y4BPm3gn2Eh61dDwDB65pa8DLss3WJfDXYC7Kx5yjP0EmXpgw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@6.2.1': + resolution: {integrity: sha512-ubLqGIMhKUH2TF/Um+wRzYXgAooQw35th+DPemGrTpgrZHpOgcnUDIDbwsk1e8iQiuJ3mV/ErTtcQrecmlj5cg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@next/env@15.1.2': + resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} + + '@next/eslint-plugin-next@15.1.2': + resolution: {integrity: sha512-sgfw3+WdaYOGPKCvM1L+UucBmRfh8V2Ygefp7ELON0+0vY7uohQwXXnVWg3rY7mXDKharQR3o7uedpfvnU2hlQ==} + + '@next/swc-darwin-arm64@15.1.2': + resolution: {integrity: sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.1.2': + resolution: {integrity: sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.1.2': + resolution: {integrity: sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.1.2': + resolution: {integrity: sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.1.2': + resolution: {integrity: sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.1.2': + resolution: {integrity: sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.1.2': + resolution: {integrity: sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.1.2': + resolution: {integrity: sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@prisma/client@5.22.0': + resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==} + engines: {node: '>=16.13'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + + '@prisma/debug@5.22.0': + resolution: {integrity: sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==} + + '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': + resolution: {integrity: sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==} + + '@prisma/engines@5.22.0': + resolution: {integrity: sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==} + + '@prisma/fetch-engine@5.22.0': + resolution: {integrity: sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==} + + '@prisma/get-platform@5.22.0': + resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.4': + resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.3': + resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.1': + resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@reduxjs/toolkit@2.5.0': + resolution: {integrity: sha512-awNe2oTodsZ6LmRqmkFhtb/KH03hUhxOamEQy411m3Njj3BbFvoBovxo4Q1cBWnV1ErprVj9MlF0UPXkng0eyg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.10.4': + resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} + engines: {node: '>=12'} + + '@tanstack/react-table@8.20.6': + resolution: {integrity: sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + engines: {node: '>=12'} + + '@tiptap/core@2.10.4': + resolution: {integrity: sha512-fExFRTRgb6MSpg2VvR5qO2dPTQAZWuUoU4UsBCurIVcPWcyVv4FG1YzgMyoLDKy44rebFtwUGJbfU9NzX7Q/bA==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.10.4': + resolution: {integrity: sha512-4JSwAM3B92YWvGzu/Vd5rovPrCGwLSaSLD5rxcLyfxLSrTDQd3n7lp78pzVgGhunVECzaGF5A0ByWWpEyS0a3w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-bold@2.10.4': + resolution: {integrity: sha512-SdO4oFQKaERCGfwOc1CLYQRtThENam2KWfWmvpsymknokt5qYzU57ft0SE1HQV9vVYEzZ9HrWIgv2xrgu0g9kg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-bubble-menu@2.10.4': + resolution: {integrity: sha512-GVtZwJaQyLBptMsmDtYl5GEobd1Uu7C9sc9Z+PdXwMuxmFfg+j07bCKCj5JJj/tjgXCSLVxWdTlDHxNrgzQHjw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-bullet-list@2.10.4': + resolution: {integrity: sha512-JVwDPgOBYRU2ivaadOh4IaQYXQEiSw6sB36KT/bwqJF2GnEvLiMwptdRMn9Uuh6xYR3imjIZtV6uZAoneZdd6g==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-code-block@2.10.4': + resolution: {integrity: sha512-qS4jnbJqghNMT2+B+GQ807ATgqkL9OQ//NlL+ZwVSe+DPDduNA9B6IB9SrWENDfOnzekpi7kcEcm+RenELARRQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.10.4': + resolution: {integrity: sha512-Vj/N0nbSQiV1o7X7pRySK9Fu72Dd266gm27TSlsts6IwJu5MklFvz7ezJUWoLjt2wmCV8/U/USmk/39ic9qjvg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-color@2.10.4': + resolution: {integrity: sha512-LgYECcWnTfonqzTUJQN+ujNlWQahGg4G6typRR44opNxwGTlmXHjc6h/JwgLiYxSMZke3EDP/17BSQDH9MMrIA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/extension-text-style': ^2.7.0 + + '@tiptap/extension-document@2.10.4': + resolution: {integrity: sha512-1Pqrl6Rr9bVEHJ3zO2dM7UUA0Qn/r70JQ9YLlestjW1sbMaMuY3Ifvu2uSyUE7SAGV3gvxwNVQCrv8f0VlVEaA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-dropcursor@2.10.4': + resolution: {integrity: sha512-0XEM/yNLaMc/sZlYOau7XpHyYiHT9LwXUe7kmze/L8eowIa/iLvmRbcnUd3rtlZ7x7wooE6UO9c7OtlREg4ZBw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-floating-menu@2.10.4': + resolution: {integrity: sha512-K2MDiu6CwQ7+Jr6g1Lh3Tuxm1L6SefSHMpQO0UW3aRGwgEV5pjlrztnBFX4K9b7MNuQ4dJGCUK9u8Cv7Xss0qg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.10.4': + resolution: {integrity: sha512-KbJfoaqTZePpkWAN+klpK5j0UVtELxN7H5B0J556/UCB/rnq+OsdEFHPks2Ss9TidqWzRUqcxUE50UZ7b8h7Ug==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.10.4': + resolution: {integrity: sha512-nW9wubW1A/CO2Ssn9wNMP08tR9Oarg9VUGzJ5qNuz38DDNyntE1SyDS+XStkeMq5nKqJ3YKhukyAJH/PiRq4Mg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-heading@2.10.4': + resolution: {integrity: sha512-7D0h0MIvE97Gx3Qwuo2xnPDK07WfCnyh4tpOPBOus4e1g6sgxVkwDwhbkYWiwvIrf4BUVJflnke/DEDCVp6/Eg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-history@2.10.4': + resolution: {integrity: sha512-fg6BNxbpMMtgKaiNI/GLcCzkxIQMwSYBhO9LA0CxLvmsWGU+My4r9W3DK6HwNoRJ9+6OleDPSLo1P73fbSTtEA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.10.4': + resolution: {integrity: sha512-s9ycm/BOGoW3L0Epnj541vdngHbFbMM488HoODd1CmVSw1C+wBWFgsukgqKjlyE3VGfZXuSb1ur9zinW0RiLJQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.10.4': + resolution: {integrity: sha512-8MIQ+wsbyxNCZDCFTVTOXrS2AvFyOhtlBNgVU2+6r6xnJV4AcfEA3qclysqrjOlL117ped/nzDeoB0AeX0CI+Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-list-item@2.10.4': + resolution: {integrity: sha512-8K3WUD5fPyw2poQKnJGGm7zlfeIbpld92+SRF4M9wkp95EzvgexTlodvxlrL3i8zKXcQQVyExWA8kCcGPFb9bA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-ordered-list@2.10.4': + resolution: {integrity: sha512-NaeEu+qFG2O0emc8WlwOM7DKNKOaqHWuNkuKrrmQzslgL+UQSEGlGMo6NEJ5sLLckPBDpIa0MuRm30407JE+cg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-paragraph@2.10.4': + resolution: {integrity: sha512-SRNVhT8OXqjpZtcyuOtofbtOpXXFrQrjqqCc/yXebda//2SfUTOvB16Lss77vQOWi6xr7TF1mZuowJgSTkcczw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-placeholder@2.10.4': + resolution: {integrity: sha512-leWG4xP7cvddR6alGZS7yojOh9941bxehgAeQDLlEisaJcNa2Od5Vbap2zipjc5sXMxZakQVChL27oH1wWhHkQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-strike@2.10.4': + resolution: {integrity: sha512-OibipsomFpOJWTPVX/z4Z53HgwDA93lE/loHGa+ONJfML1dO6Zd6UTwzaVO1/g8WOwRgwkYu/6JnhxLKRlP8Lg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-text-align@2.10.4': + resolution: {integrity: sha512-rt2Hz3N081QAgkKKSMpyDZTKorBmXKpeHkYIw+ArVuvBYhi8x5wVyZgZ2SIMW9A5G4rx1M0czn7xNi+/P3NopQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-text-style@2.10.4': + resolution: {integrity: sha512-ibq7avkcwHyUSG53Hf+P31rrwsKVbbiqbWZM4kXC7M2X3iUwFrtvaa+SWzyWQfE1jl2cCrD1+rfSkj/alcOKGg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-text@2.10.4': + resolution: {integrity: sha512-wPdVxCHrIS9S+8n08lgyyqRZPj9FBbyLlFt74/lV5yBC3LOorq1VKdjrTskmaj4jud7ImXoKDyBddAYTHdJ1xw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-underline@2.10.4': + resolution: {integrity: sha512-KhlCndQFMe/Gsz+3qkVn9z1utDy8y1igvdePijMjA5B8PTu0hPs2Q1d6szfLTBdtoFNkCokknxzXhSY0OFJEyQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/pm@2.10.4': + resolution: {integrity: sha512-pZ4NEkRtYoDLe0spARvXZ1N3hNv/5u6vfPdPtEbmNpoOSjSNqDC1kVM+qJY0iaCYpxbxcv7cxn3kBumcFLQpJQ==} + + '@tiptap/react@2.10.4': + resolution: {integrity: sha512-JTeqDB+xgjo46QC9ILRXe2TcSfxKVRwhZ3vDvYoemN7giRk5a/WsCF1VQIT1fax+tCl6kfv3U1f4Mkx0DkbPkA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.7.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tiptap/starter-kit@2.10.4': + resolution: {integrity: sha512-tu/WCs9Mkr5Nt8c3/uC4VvAbQlVX0OY7ygcqdzHGUeG9zP3twdW7o5xM3kyDKR2++sbVzqu5Ll5qNU+1JZvPGQ==} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/geojson-vt@3.2.5': + resolution: {integrity: sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==} + + '@types/geojson@7946.0.15': + resolution: {integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==} + + '@types/js-cookie@2.2.7': + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/mapbox-gl@3.4.1': + resolution: {integrity: sha512-NsGKKtgW93B+UaLPti6B7NwlxYlES5DpV5Gzj9F75rK5ALKsqSk15CiEHbOnTr09RGbr6ZYiCdI+59NNNcAImg==} + + '@types/mapbox__point-geometry@0.1.4': + resolution: {integrity: sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==} + + '@types/mapbox__vector-tile@1.3.4': + resolution: {integrity: sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/negotiator@0.6.3': + resolution: {integrity: sha512-JkXTOdKs5MF086b/pt8C3+yVp3iDUwG635L7oCH6HvJvvr6lSUU5oe/gLXnPEfYRROHjJIPgCV6cuAg8gGkntQ==} + + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pbf@3.0.5': + resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + + '@types/supercluster@7.1.3': + resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + + '@types/tar@6.1.13': + resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + + '@xobotyi/scrollbar-width@1.9.5': + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apexcharts@3.49.0: + resolution: {integrity: sha512-2T9HnbQFLCuYRPndQLmh+bEQFoz0meUbvASaGgiSKDuYhWcLBodJtIpKql2aOtMx4B/sHrWW0dm90HsW4+h2PQ==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + attr-accept@2.2.5: + resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} + engines: {node: '>=4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bootstrap-icons@1.11.3: + resolution: {integrity: sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytewise-core@1.2.3: + resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} + + bytewise@1.1.0: + resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + cheap-ruler@4.0.0: + resolution: {integrity: sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.0.4: + resolution: {integrity: sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.3.0: + resolution: {integrity: sha512-kxltocVQCwQNFvw40dlVRYeAkAvtYjMFZYNlOcsF5wExPpGwPxMwgx4IfDJvBRPtBpnQwItd5WkTaR0ZwT/TmQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssjanus@2.3.0: + resolution: {integrity: sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==} + engines: {node: '>=10.0.0'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dotenv-cli@7.4.4: + resolution: {integrity: sha512-XkBYCG0tPIes+YZr4SpfFv76SQrV/LeCE8CI7JSEMi3VR9MvTihCGTOtbIexD6i2mXF+6px7trb1imVCXSNMDw==} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + earcut@3.0.1: + resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.75: + resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} + + emoji-mart@5.6.0: + resolution: {integrity: sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-abstract@1.23.6: + resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.0: + resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.1.2: + resolution: {integrity: sha512-PrMm1/4zWSJ689wd/ypWIR5ZF1uvmp3EkgpgBV1Yu6PhEobBjXMGgT8bVNelwl17LXojO8D5ePFRiI4qXjsPRA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.2: + resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} + engines: {node: '>=18'} + + file-selector@2.1.2: + resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} + engines: {node: '>= 12'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + geojson-vt@4.0.2: + resolution: {integrity: sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==} + + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + grid-index@1.1.0: + resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@6.0.2: + resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + engines: {node: '>= 4'} + + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + + input-otp@1.4.1: + resolution: {integrity: sha512-+yvpmKYKHi9jIGngxagY9oWiiblPB7+nEO75F2l2o4vs+6vpPZZmUl4tBNYuTCvQjhvEIbdNeJu70bhfYP2nbw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.0: + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + iterator.prototype@1.1.4: + resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-pretty-compact@3.0.0: + resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + + keen-slider@6.8.6: + resolution: {integrity: sha512-dcEQ7GDBpCjUQA8XZeWh3oBBLLmyn8aoeIQFGL/NTVkoEOsmlnXqA4QykUm/SncolAZYGsEk/PfUhLZ7mwMM2w==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + load-script@1.0.0: + resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + mapbox-gl@3.9.0: + resolution: {integrity: sha512-QKAxLHcbdoqobXuhu2PP6HJDSy0/GhfZuO5O8BrmwfR0ihZbA5ihYD/u0wGqu2QTDWi/DbgCWJIlV2mXh2Sekg==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nano-css@5.6.2: + resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} + peerDependencies: + react: '*' + react-dom: '*' + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-auth@4.24.11: + resolution: {integrity: sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==} + peerDependencies: + '@auth/core': 0.34.2 + next: ^12.2.5 || ^13 || ^14 || ^15 + nodemailer: ^6.6.5 + react: ^17.0.2 || ^18 || ^19 + react-dom: ^17.0.2 || ^18 || ^19 + peerDependenciesMeta: + '@auth/core': + optional: true + nodemailer: + optional: true + + next@15.1.2: + resolution: {integrity: sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + oauth4webapi@3.1.4: + resolution: {integrity: sha512-eVfN3nZNbok2s/ROifO0UAc5G8nRoLSbrcKJ09OqmucgnhXEfdIQOR4gq1eJH1rN3gV7rNw62bDEgftsgFtBEg==} + + oauth@0.9.15: + resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + openid-client@5.7.1: + resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.7: + resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pbf@3.3.0: + resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} + hasBin: true + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@14.1.0: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.0: + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.0.0: + resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + engines: {node: '>=4'} + + postcss-styled-syntax@0.7.0: + resolution: {integrity: sha512-OeStzPkHJ1/WDGRKm/JuVK8UdJbjt3U7AFC+zUc9omJ79SaXSxWoy+PXxJz7t8vOO8HcUgCLndNEQfLvZ74TuQ==} + engines: {node: '>=14.17'} + peerDependencies: + postcss: ^8.4.21 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + potpack@2.0.0: + resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==} + + preact-render-to-string@5.2.6: + resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} + peerDependencies: + preact: '>=10' + + preact-render-to-string@6.5.11: + resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} + peerDependencies: + preact: '>=10' + + preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + + preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + + preact@10.25.3: + resolution: {integrity: sha512-dzQmIFtM970z+fP9ziQ3yG4e3ULIbwZzJ734vaMVUTaKQ2+Ru1Ou/gjshOYVHCcd1rpAelC6ngjvjDXph98unQ==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + + prisma@5.22.0: + resolution: {integrity: sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==} + engines: {node: '>=16.13'} + hasBin: true + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.6.2: + resolution: {integrity: sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==} + + prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + + prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + + prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + + prosemirror-markdown@1.13.1: + resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==} + + prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + + prosemirror-model@1.24.1: + resolution: {integrity: sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==} + + prosemirror-schema-basic@1.2.3: + resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} + + prosemirror-schema-list@1.5.0: + resolution: {integrity: sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-tables@1.6.1: + resolution: {integrity: sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.2: + resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==} + + prosemirror-view@1.37.1: + resolution: {integrity: sha512-MEAnjOdXU1InxEmhjgmEzQAikaS6lF3hD64MveTPpjOGNTl87iRLA1HupC/DEV6YuK7m4Q9DHFNTjwIVtqz5NA==} + + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + + react-apexcharts@1.4.1: + resolution: {integrity: sha512-G14nVaD64Bnbgy8tYxkjuXEUp/7h30Q0U33xc3AwtGFijJB9nHqOt1a6eG0WBn055RgRg+NwqbKGtqPxy15d0Q==} + peerDependencies: + apexcharts: ^3.41.0 + react: '>=0.13' + + react-colorful@5.6.1: + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-datepicker@7.3.0: + resolution: {integrity: sha512-EqRKLAtLZUTztiq6a+tjSjQX9ES0Xd229JPckAtyZZ4GoY3rtvNWAzkYZnQUf6zTWT50Ki0+t+W9VRQIkSJLfg==} + peerDependencies: + react: ^16.9.0 || ^17 || ^18 + react-dom: ^16.9.0 || ^17 || ^18 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-dropzone@14.3.5: + resolution: {integrity: sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-hook-form@7.54.1: + resolution: {integrity: sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + + react-map-gl@7.1.8: + resolution: {integrity: sha512-zwF16XMOdOKH4py5ehS1bgQIChqW8UN3b1bXps+JnADbYLSbOoUPQ3tNw0EZ2OTBWArR5aaQlhlEqg4lE47T8A==} + peerDependencies: + mapbox-gl: '>=1.13.0' + maplibre-gl: '>=1.13.0' + react: '>=16.3.0' + react-dom: '>=16.3.0' + peerDependenciesMeta: + mapbox-gl: + optional: true + maplibre-gl: + optional: true + + react-onclickoutside@6.13.1: + resolution: {integrity: sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==} + peerDependencies: + react: ^15.5.x || ^16.x || ^17.x || ^18.x + react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x + + react-perfect-scrollbar@1.5.8: + resolution: {integrity: sha512-bQ46m70gp/HJtiBOF3gRzBISSZn8FFGNxznTdmTG8AAwpxG1bJCyn7shrgjEvGSQ5FJEafVEiosY+ccER11OSA==} + peerDependencies: + react: '>=16.3.3' + react-dom: '>=16.3.3' + + react-player@2.16.0: + resolution: {integrity: sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ==} + peerDependencies: + react: '>=16.6.0' + + react-redux@9.2.0: + resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-smooth@4.0.4: + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-toastify@10.0.6: + resolution: {integrity: sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-universal-interface@0.6.2: + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + + react-use@17.6.0: + resolution: {integrity: sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==} + peerDependencies: + react: '*' + react-dom: '*' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.15.0: + resolution: {integrity: sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-to-js@3.1.2: + resolution: {integrity: sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w==} + engines: {node: '>=4.0.0'} + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + sort-asc@0.2.0: + resolution: {integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==} + engines: {node: '>=0.10.0'} + + sort-desc@0.2.0: + resolution: {integrity: sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==} + engines: {node: '>=0.10.0'} + + sort-object@3.0.3: + resolution: {integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + + stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + + stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylelint-use-logical-spec@5.0.1: + resolution: {integrity: sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA==} + engines: {node: '>=8.0.0'} + peerDependencies: + stylelint: '>=11 < 17' + + stylelint@16.12.0: + resolution: {integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==} + engines: {node: '>=18.12.0'} + hasBin: true + + stylis-plugin-rtl@2.1.1: + resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} + peerDependencies: + stylis: 4.x + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supercluster@8.0.1: + resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + svg.draggable.js@2.2.2: + resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==} + engines: {node: '>= 0.8.0'} + + svg.easing.js@2.0.0: + resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==} + engines: {node: '>= 0.8.0'} + + svg.filter.js@2.0.2: + resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==} + engines: {node: '>= 0.8.0'} + + svg.js@2.7.1: + resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==} + + svg.pathmorphing.js@0.1.3: + resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==} + engines: {node: '>= 0.8.0'} + + svg.resize.js@1.4.3: + resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==} + engines: {node: '>= 0.8.0'} + + svg.select.js@2.1.2: + resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==} + engines: {node: '>= 0.8.0'} + + svg.select.js@3.0.1: + resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==} + engines: {node: '>= 0.8.0'} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + tailwindcss-logical@3.0.1: + resolution: {integrity: sha512-mv585RJfzS/Cu9Rpl2M5H+JSOdU3qjLHzKMtg63oD5lXfehRJpldbEqll20Obvlexq0Cmyg86l7cmb/I5hEutg==} + + tailwindcss@3.3.1: + resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinyqueue@3.0.0: + resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + typewise-core@1.2.0: + resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} + + typewise@1.0.3: + resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + undici@6.21.0: + resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + engines: {node: '>=18.17'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + valibot@0.42.1: + resolution: {integrity: sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + vt-pbf@3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@antfu/install-pkg@0.4.1': + dependencies: + package-manager-detector: 0.2.7 + tinyexec: 0.3.1 + + '@antfu/utils@0.7.10': {} + + '@auth/core@0.37.4': + dependencies: + '@panva/hkdf': 1.2.1 + jose: 5.9.6 + oauth4webapi: 3.1.4 + preact: 10.24.3 + preact-render-to-string: 6.5.11(preact@10.24.3) + + '@auth/prisma-adapter@2.7.4(@prisma/client@5.22.0(prisma@5.22.0))': + dependencies: + '@auth/core': 0.37.4 + '@prisma/client': 5.22.0(prisma@5.22.0) + transitivePeerDependencies: + - '@simplewebauthn/browser' + - '@simplewebauthn/server' + - nodemailer + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + + '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)': + dependencies: + postcss-selector-parser: 7.0.0 + + '@dual-bundle/import-meta-resolve@4.1.0': {} + + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emoji-mart/data@1.2.1': {} + + '@emoji-mart/react@1.1.1(emoji-mart@5.6.0)(react@18.3.1)': + dependencies: + emoji-mart: 5.6.0 + react: 18.3.1 + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/react@0.27.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.8': {} + + '@formatjs/intl-localematcher@0.5.9': + dependencies: + tslib: 2.8.1 + + '@formkit/drag-and-drop@0.2.6': {} + + '@fullcalendar/common@5.11.5': + dependencies: + tslib: 2.8.1 + + '@fullcalendar/core@6.1.15': + dependencies: + preact: 10.12.1 + + '@fullcalendar/daygrid@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + + '@fullcalendar/interaction@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + + '@fullcalendar/list@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + + '@fullcalendar/react@6.1.15(@fullcalendar/core@6.1.15)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@fullcalendar/core': 6.1.15 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@fullcalendar/timegrid@6.1.15(@fullcalendar/core@6.1.15)': + dependencies: + '@fullcalendar/core': 6.1.15 + '@fullcalendar/daygrid': 6.1.15(@fullcalendar/core@6.1.15) + + '@hookform/resolvers@3.9.1(react-hook-form@7.54.1(react@18.3.1))': + dependencies: + react-hook-form: 7.54.1(react@18.3.1) + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@iconify/json@2.2.286': + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.2 + + '@iconify/tools@4.1.1': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.2.1 + '@types/tar': 6.1.13 + axios: 1.7.9 + cheerio: 1.0.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 0.5.1 + pathe: 1.1.2 + svgo: 3.3.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.2.1': + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.14.0 + kolorist: 1.8.0 + local-pkg: 0.5.1 + mlly: 1.7.3 + transitivePeerDependencies: + - supports-color + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mapbox/jsonlint-lines-primitives@2.0.2': {} + + '@mapbox/mapbox-gl-supported@3.0.0': {} + + '@mapbox/point-geometry@0.1.0': {} + + '@mapbox/tiny-sdf@2.0.6': {} + + '@mapbox/unitbezier@0.0.1': {} + + '@mapbox/vector-tile@1.3.1': + dependencies: + '@mapbox/point-geometry': 0.1.0 + + '@mapbox/whoots-js@3.1.0': {} + + '@maplibre/maplibre-gl-style-spec@19.3.3': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 + json-stringify-pretty-compact: 3.0.0 + minimist: 1.2.8 + rw: 1.3.3 + sort-object: 3.0.3 + + '@mui/base@5.0.0-beta.66(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.18) + '@mui/utils': 6.2.1(@types/react@18.3.18)(react@18.3.1) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + + '@mui/core-downloads-tracker@6.2.1': {} + + '@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@mui/material@6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/base': 5.0.0-beta.66(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.18) + '@mui/utils': 6.2.1(@types/react@18.3.18)(react@18.3.1) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + + '@mui/material-nextjs@6.2.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(next@15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + next: 15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@emotion/cache': 11.14.0 + '@types/react': 18.3.18 + + '@mui/material@6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/core-downloads-tracker': 6.2.1 + '@mui/system': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.18) + '@mui/utils': 6.2.1(@types/react@18.3.18)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@18.3.18) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 19.0.0 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + + '@mui/private-theming@6.2.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/utils': 6.2.1(@types/react@18.3.18)(react@18.3.1) + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@mui/styled-engine@6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + + '@mui/system@6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/private-theming': 6.2.1(@types/react@18.3.18)(react@18.3.1) + '@mui/styled-engine': 6.2.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.20(@types/react@18.3.18) + '@mui/utils': 6.2.1(@types/react@18.3.18)(react@18.3.1) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 + + '@mui/types@7.2.20(@types/react@18.3.18)': + optionalDependencies: + '@types/react': 18.3.18 + + '@mui/utils@6.2.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@mui/types': 7.2.20(@types/react@18.3.18) + '@types/prop-types': 15.7.14 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 19.0.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@next/env@15.1.2': {} + + '@next/eslint-plugin-next@15.1.2': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.1.2': + optional: true + + '@next/swc-darwin-x64@15.1.2': + optional: true + + '@next/swc-linux-arm64-gnu@15.1.2': + optional: true + + '@next/swc-linux-arm64-musl@15.1.2': + optional: true + + '@next/swc-linux-x64-gnu@15.1.2': + optional: true + + '@next/swc-linux-x64-musl@15.1.2': + optional: true + + '@next/swc-win32-arm64-msvc@15.1.2': + optional: true + + '@next/swc-win32-x64-msvc@15.1.2': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@panva/hkdf@1.2.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@popperjs/core@2.11.8': {} + + '@prisma/client@5.22.0(prisma@5.22.0)': + optionalDependencies: + prisma: 5.22.0 + + '@prisma/debug@5.22.0': {} + + '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': {} + + '@prisma/engines@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 + '@prisma/fetch-engine': 5.22.0 + '@prisma/get-platform': 5.22.0 + + '@prisma/fetch-engine@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 + '@prisma/get-platform': 5.22.0 + + '@prisma/get-platform@5.22.0': + dependencies: + '@prisma/debug': 5.22.0 + + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-dialog@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@reduxjs/toolkit@2.5.0(react-redux@9.2.0(@types/react@18.3.18)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + dependencies: + immer: 10.1.1 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.1 + optionalDependencies: + react: 18.3.1 + react-redux: 9.2.0(@types/react@18.3.18)(react@18.3.1)(redux@5.0.1) + + '@remirror/core-constants@3.0.0': {} + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.10.4': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tanstack/match-sorter-utils@8.19.4': + dependencies: + remove-accents: 0.5.0 + + '@tanstack/react-table@8.20.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/table-core': 8.20.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/table-core@8.20.5': {} + + '@tiptap/core@2.10.4(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-blockquote@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-bold@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-bubble-menu@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-code-block@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-code@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-color@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/extension-text-style': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + + '@tiptap/extension-document@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-dropcursor@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-floating-menu@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + tippy.js: 6.3.7 + + '@tiptap/extension-gapcursor@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-hard-break@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-heading@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-history@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-horizontal-rule@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-italic@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-list-item@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-ordered-list@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-paragraph@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-placeholder@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + + '@tiptap/extension-strike@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-text-align@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-text-style@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-text@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/extension-underline@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + + '@tiptap/pm@2.10.4': + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.6.2 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.4.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.13.1 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.24.1 + prosemirror-schema-basic: 1.2.3 + prosemirror-schema-list: 1.5.0 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.6.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.37.1) + prosemirror-transform: 1.10.2 + prosemirror-view: 1.37.1 + + '@tiptap/react@2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/extension-bubble-menu': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-floating-menu': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/pm': 2.10.4 + '@types/use-sync-external-store': 0.0.6 + fast-deep-equal: 3.1.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.4.0(react@18.3.1) + + '@tiptap/starter-kit@2.10.4': + dependencies: + '@tiptap/core': 2.10.4(@tiptap/pm@2.10.4) + '@tiptap/extension-blockquote': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-bold': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-bullet-list': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-code': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-code-block': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-document': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-dropcursor': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-gapcursor': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-hard-break': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-heading': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-history': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-horizontal-rule': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4))(@tiptap/pm@2.10.4) + '@tiptap/extension-italic': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-list-item': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-ordered-list': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-paragraph': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-strike': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-text': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/extension-text-style': 2.10.4(@tiptap/core@2.10.4(@tiptap/pm@2.10.4)) + '@tiptap/pm': 2.10.4 + + '@trysound/sax@0.2.0': {} + + '@types/d3-array@3.2.1': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.0': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.6': + dependencies: + '@types/d3-path': 3.1.0 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.10.2 + + '@types/geojson-vt@3.2.5': + dependencies: + '@types/geojson': 7946.0.15 + + '@types/geojson@7946.0.15': {} + + '@types/js-cookie@2.2.7': {} + + '@types/json5@0.0.29': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.10.2 + + '@types/linkify-it@5.0.0': {} + + '@types/mapbox-gl@3.4.1': + dependencies: + '@types/geojson': 7946.0.15 + + '@types/mapbox__point-geometry@0.1.4': {} + + '@types/mapbox__vector-tile@1.3.4': + dependencies: + '@types/geojson': 7946.0.15 + '@types/mapbox__point-geometry': 0.1.4 + '@types/pbf': 3.0.5 + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/negotiator@0.6.3': {} + + '@types/node@22.10.2': + dependencies: + undici-types: 6.20.0 + + '@types/parse-json@4.0.2': {} + + '@types/pbf@3.0.5': {} + + '@types/prop-types@15.7.14': {} + + '@types/react-dom@18.3.5(@types/react@18.3.18)': + dependencies: + '@types/react': 18.3.18 + + '@types/react-transition-group@4.4.12(@types/react@18.3.18)': + dependencies: + '@types/react': 18.3.18 + + '@types/react@18.3.18': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + + '@types/supercluster@7.1.3': + dependencies: + '@types/geojson': 7946.0.15 + + '@types/tar@6.1.13': + dependencies: + '@types/node': 22.10.2 + minipass: 4.2.8 + + '@types/use-sync-external-store@0.0.6': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.10.2 + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.1': {} + + '@xobotyi/scrollbar-width@1.9.5': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + apexcharts@3.49.0: + dependencies: + '@yr/monotone-cubic-spline': 1.0.3 + svg.draggable.js: 2.2.2 + svg.easing.js: 2.0.0 + svg.filter.js: 2.0.2 + svg.pathmorphing.js: 0.1.3 + svg.resize.js: 1.4.3 + svg.select.js: 3.0.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 + is-string: 1.1.1 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 + + assign-symbols@1.0.0: {} + + ast-types-flow@0.0.8: {} + + astral-regex@2.0.0: {} + + asynckit@0.4.0: {} + + attr-accept@2.2.5: {} + + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-lite: 1.0.30001690 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.10.2: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + bootstrap-icons@1.11.3: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.75 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-crc32@0.2.13: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytewise-core@1.2.3: + dependencies: + typewise-core: 1.2.0 + + bytewise@1.1.0: + dependencies: + bytewise-core: 1.2.3 + typewise: 1.0.3 + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001690: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cheap-ruler@4.0.0: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + classnames@2.5.1: {} + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + cmdk@1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.4.0(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + + colord@2.9.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@4.1.1: {} + + commander@7.2.0: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.3.0: {} + + convert-source-map@1.9.0: {} + + cookie@0.7.2: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@9.0.0(typescript@5.5.4): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.4 + + crelt@1.0.6: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-functions-list@3.2.3: {} + + css-in-js-utils@3.1.0: + dependencies: + hyphenate-style-name: 1.1.0 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + csscolorparser@1.0.3: {} + + cssesc@3.0.0: {} + + cssjanus@2.3.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + date-fns@3.6.0: {} + + date-fns@4.1.0: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decimal.js-light@2.5.1: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + detect-libc@2.0.3: + optional: true + + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.0 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv-cli@7.4.4: + dependencies: + cross-spawn: 7.0.6 + dotenv: 16.4.7 + dotenv-expand: 10.0.0 + minimist: 1.2.8 + + dotenv-expand@10.0.0: {} + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + earcut@3.0.1: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.75: {} + + emoji-mart@5.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.0: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-abstract@1.23.6: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.6 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.3 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.0: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.6 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.4 + safe-array-concat: 1.1.3 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.6 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.1.2(eslint@8.57.1)(typescript@5.5.4): + dependencies: + '@next/eslint-plugin-next': 15.1.2 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-react: 7.37.2(eslint@8.57.1) + eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.0 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.57.1 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.2(eslint@8.57.1): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.0 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + 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.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + eventemitter3@4.0.7: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-equals@5.0.1: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-shallow-equal@1.0.0: {} + + fast-uri@3.0.3: {} + + fastest-levenshtein@1.0.16: {} + + fastest-stable-stringify@2.0.2: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-entry-cache@9.1.0: + dependencies: + flat-cache: 5.0.0 + + file-selector@2.1.2: + dependencies: + tslib: 2.8.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 5.0.10 + + flat-cache@5.0.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + follow-redirects@1.15.9: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + geojson-vt@4.0.2: {} + + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-value@2.0.6: {} + + gl-matrix@3.4.3: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + globjoin@0.1.4: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + grid-index@1.1.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-tags@3.3.1: {} + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + hyphenate-style-name@1.1.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + ignore@6.0.2: {} + + immer@10.1.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + ini@1.3.8: {} + + inline-style-prefixer@7.0.1: + dependencies: + css-in-js-utils: 3.1.0 + + input-otp@1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + internmap@2.0.3: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: + optional: true + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-bun-module@1.3.0: + dependencies: + semver: 7.6.3 + + is-callable@1.2.7: {} + + is-core-module@2.16.0: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + iterator.prototype@1.1.4: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.9 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.7: {} + + jose@4.15.9: {} + + jose@5.9.6: {} + + js-cookie@2.2.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-pretty-compact@3.0.0: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + kdbush@4.0.2: {} + + keen-slider@6.8.6: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + known-css-properties@0.35.0: {} + + kolorist@1.8.0: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@2.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + load-script@1.0.0: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.2.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + mapbox-gl@3.9.0: + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 3.0.0 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 2.0.6 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + '@types/geojson': 7946.0.15 + '@types/geojson-vt': 3.2.5 + '@types/mapbox__point-geometry': 0.1.4 + '@types/mapbox__vector-tile': 1.3.4 + '@types/pbf': 3.0.5 + '@types/supercluster': 7.1.3 + cheap-ruler: 4.0.0 + csscolorparser: 1.0.3 + earcut: 3.0.1 + geojson-vt: 4.0.2 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + kdbush: 4.0.2 + murmurhash-js: 1.0.0 + pbf: 3.3.0 + potpack: 2.0.0 + quickselect: 3.0.0 + serialize-to-js: 3.1.2 + supercluster: 8.0.1 + tinyqueue: 3.0.0 + vt-pbf: 3.1.3 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.14: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + mdurl@2.0.0: {} + + memoize-one@5.2.1: {} + + meow@13.2.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 + + ms@2.1.3: {} + + murmurhash-js@1.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + css-tree: 1.1.3 + csstype: 3.1.3 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 7.0.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rtl-css-js: 1.16.1 + stacktrace-js: 2.0.2 + stylis: 4.3.4 + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + next-auth@4.24.11(next@15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@panva/hkdf': 1.2.1 + cookie: 0.7.2 + jose: 4.15.9 + next: 15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + oauth: 0.9.15 + openid-client: 5.7.1 + preact: 10.25.3 + preact-render-to-string: 5.2.6(preact@10.25.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + uuid: 8.3.2 + + next@15.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.1.2 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001690 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.1.2 + '@next/swc-darwin-x64': 15.1.2 + '@next/swc-linux-arm64-gnu': 15.1.2 + '@next/swc-linux-arm64-musl': 15.1.2 + '@next/swc-linux-x64-gnu': 15.1.2 + '@next/swc-linux-x64-musl': 15.1.2 + '@next/swc-win32-arm64-msvc': 15.1.2 + '@next/swc-win32-x64-msvc': 15.1.2 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + oauth4webapi@3.1.4: {} + + oauth@0.9.15: {} + + object-assign@4.1.1: {} + + object-hash@2.2.0: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + oidc-token-hash@5.0.3: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + openid-client@5.7.1: + dependencies: + jose: 4.15.9 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.0.3 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + orderedmap@2.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.7: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.2.1 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.2.1 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + path-type@5.0.0: {} + + pathe@1.1.2: {} + + pbf@3.3.0: + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + + pend@1.2.0: {} + + perfect-scrollbar@1.5.6: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-types@1.2.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + + possible-typed-array-names@1.0.0: {} + + postcss-import@14.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-import@15.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.4.49): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.49 + + postcss-load-config@3.1.4(postcss@8.4.49): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.4.49 + + postcss-load-config@4.0.2(postcss@8.4.49): + dependencies: + lilconfig: 3.1.3 + yaml: 2.6.1 + optionalDependencies: + postcss: 8.4.49 + + postcss-nested@6.0.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.0.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-styled-syntax@0.7.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + typescript: 5.7.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + potpack@2.0.0: {} + + preact-render-to-string@5.2.6(preact@10.25.3): + dependencies: + preact: 10.25.3 + pretty-format: 3.8.0 + + preact-render-to-string@6.5.11(preact@10.24.3): + dependencies: + preact: 10.24.3 + + preact@10.12.1: {} + + preact@10.24.3: {} + + preact@10.25.3: {} + + prelude-ls@1.2.1: {} + + prettier@3.4.2: {} + + pretty-format@3.8.0: {} + + prisma@5.22.0: + dependencies: + '@prisma/engines': 5.22.0 + optionalDependencies: + fsevents: 2.3.3 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + prosemirror-changeset@2.2.1: + dependencies: + prosemirror-transform: 1.10.2 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.3 + + prosemirror-commands@1.6.2: + dependencies: + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + + prosemirror-dropcursor@1.8.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.37.1 + + prosemirror-gapcursor@1.3.2: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.37.1 + + prosemirror-history@1.4.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.37.1 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.4.0: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + + prosemirror-keymap@1.2.2: + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.1: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.24.1 + + prosemirror-menu@1.2.4: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.6.2 + prosemirror-history: 1.4.1 + prosemirror-state: 1.4.3 + + prosemirror-model@1.24.1: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.3: + dependencies: + prosemirror-model: 1.24.1 + + prosemirror-schema-list@1.5.0: + dependencies: + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.24.1 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.37.1 + + prosemirror-tables@1.6.1: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + prosemirror-view: 1.37.1 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.37.1): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.37.1 + + prosemirror-transform@1.10.2: + dependencies: + prosemirror-model: 1.24.1 + + prosemirror-view@1.37.1: + dependencies: + prosemirror-model: 1.24.1 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.2 + + protocol-buffers-schema@3.6.0: {} + + proxy-from-env@1.1.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + quickselect@3.0.0: {} + + react-apexcharts@1.4.1(apexcharts@3.49.0)(react@18.3.1): + dependencies: + apexcharts: 3.49.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-datepicker@7.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 2.1.1 + date-fns: 3.6.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-onclickoutside: 6.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dropzone@14.3.5(react@18.3.1): + dependencies: + attr-accept: 2.2.5 + file-selector: 2.1.2 + prop-types: 15.8.1 + react: 18.3.1 + + react-fast-compare@3.2.2: {} + + react-hook-form@7.54.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-is@19.0.0: {} + + react-map-gl@7.1.8(mapbox-gl@3.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@maplibre/maplibre-gl-style-spec': 19.3.3 + '@types/mapbox-gl': 3.4.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + mapbox-gl: 3.9.0 + + react-onclickoutside@6.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-perfect-scrollbar@1.5.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + perfect-scrollbar: 1.5.6 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-player@2.16.0(react@18.3.1): + dependencies: + deepmerge: 4.3.1 + load-script: 1.0.0 + memoize-one: 5.2.1 + prop-types: 15.8.1 + react: 18.3.1 + react-fast-compare: 3.2.2 + + react-redux@9.2.0(@types/react@18.3.18)(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.6 + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + redux: 5.0.1 + + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + react-remove-scroll@2.6.2(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + + react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + fast-equals: 5.0.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + react-toastify@10.0.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-universal-interface@0.6.2(react@18.3.1)(tslib@2.8.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + react-use@17.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.8.1) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.8.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recharts-scale@0.4.5: + dependencies: + decimal.js-light: 2.5.1 + + recharts@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@5.0.1: {} + + reflect.getprototypeof@1.0.9: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dunder-proto: 1.0.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + which-builtin-type: 1.2.1 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + remove-accents@0.5.0: {} + + require-from-string@2.0.2: {} + + reselect@5.1.1: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.0 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rope-sequence@1.3.4: {} + + rtl-css-js@1.16.1: + dependencies: + '@babel/runtime': 7.26.0 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + screenfull@5.2.0: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-to-js@3.1.2: {} + + server-only@0.0.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-harmonic-interval@1.0.1: {} + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + sort-asc@0.2.0: {} + + sort-desc@0.2.0: {} + + sort-object@3.0.3: + dependencies: + bytewise: 1.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + sort-asc: 0.2.0 + sort-desc: 0.2.0 + union-value: 1.0.1 + + source-map-js@1.2.1: {} + + source-map@0.5.6: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + stable-hash@0.0.4: {} + + stack-generator@2.0.10: + dependencies: + stackframe: 1.3.4 + + stackframe@1.3.4: {} + + stacktrace-gps@3.1.2: + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + + stacktrace-js@2.0.2: + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.3 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.6 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + styled-jsx@5.1.6(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + + stylelint-use-logical-spec@5.0.1(stylelint@16.12.0(typescript@5.5.4)): + dependencies: + stylelint: 16.12.0(typescript@5.5.4) + + stylelint@16.12.0(typescript@5.5.4): + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.5.4) + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.0 + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.1.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 6.0.2 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.35.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.4.49) + postcss-selector-parser: 7.0.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.1.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + stylis-plugin-rtl@2.1.1(stylis@4.3.4): + dependencies: + cssjanus: 2.3.0 + stylis: 4.3.4 + + stylis@4.2.0: {} + + stylis@4.3.4: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supercluster@8.0.1: + dependencies: + kdbush: 4.0.2 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + svg.draggable.js@2.2.2: + dependencies: + svg.js: 2.7.1 + + svg.easing.js@2.0.0: + dependencies: + svg.js: 2.7.1 + + svg.filter.js@2.0.2: + dependencies: + svg.js: 2.7.1 + + svg.js@2.7.1: {} + + svg.pathmorphing.js@0.1.3: + dependencies: + svg.js: 2.7.1 + + svg.resize.js@1.4.3: + dependencies: + svg.js: 2.7.1 + svg.select.js: 2.1.2 + + svg.select.js@2.1.2: + dependencies: + svg.js: 2.7.1 + + svg.select.js@3.0.1: + dependencies: + svg.js: 2.7.1 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + tabbable@6.2.0: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tailwindcss-logical@3.0.1(postcss@8.4.49): + dependencies: + tailwindcss: 3.3.1(postcss@8.4.49) + transitivePeerDependencies: + - postcss + - ts-node + + tailwindcss@3.3.1(postcss@8.4.49): + dependencies: + arg: 5.0.2 + chokidar: 3.6.0 + color-name: 1.1.4 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 14.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 3.1.4(postcss@8.4.49) + postcss-nested: 6.0.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + throttle-debounce@3.0.1: {} + + tiny-invariant@1.3.3: {} + + tinyexec@0.3.1: {} + + tinyqueue@3.0.0: {} + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + ts-api-utils@1.4.3(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-easing@0.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.9 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.9 + + typescript@5.5.4: {} + + typescript@5.7.2: {} + + typewise-core@1.2.0: {} + + typewise@1.0.3: + dependencies: + typewise-core: 1.2.0 + + uc.micro@2.1.0: {} + + ufo@1.5.4: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.20.0: {} + + undici@6.21.0: {} + + unicorn-magic@0.1.0: {} + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@2.0.1: {} + + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + use-sync-external-store@1.4.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + valibot@0.42.1(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + victory-vendor@36.9.2: + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + vt-pbf@3.1.3: + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.3.0 + + w3c-keyname@2.2.8: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.0.10 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.6.1: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..e64b252 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,10 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + 'tailwindcss/nesting': {}, + tailwindcss: {}, + autoprefixer: {} + } +} + +export default config diff --git a/public/images/apps/academy/1.png b/public/images/apps/academy/1.png new file mode 100644 index 0000000..fa4b64a Binary files /dev/null and b/public/images/apps/academy/1.png differ diff --git a/public/images/apps/academy/2.png b/public/images/apps/academy/2.png new file mode 100644 index 0000000..56a9b97 Binary files /dev/null and b/public/images/apps/academy/2.png differ diff --git a/public/images/apps/academy/3.png b/public/images/apps/academy/3.png new file mode 100644 index 0000000..7c4b6eb Binary files /dev/null and b/public/images/apps/academy/3.png differ diff --git a/public/images/apps/academy/4.png b/public/images/apps/academy/4.png new file mode 100644 index 0000000..f770e10 Binary files /dev/null and b/public/images/apps/academy/4.png differ diff --git a/public/images/apps/academy/5.png b/public/images/apps/academy/5.png new file mode 100644 index 0000000..44ce29d Binary files /dev/null and b/public/images/apps/academy/5.png differ diff --git a/public/images/apps/academy/6.png b/public/images/apps/academy/6.png new file mode 100644 index 0000000..ca3500a Binary files /dev/null and b/public/images/apps/academy/6.png differ diff --git a/public/images/apps/academy/7.png b/public/images/apps/academy/7.png new file mode 100644 index 0000000..03f49bb Binary files /dev/null and b/public/images/apps/academy/7.png differ diff --git a/public/images/apps/academy/8.png b/public/images/apps/academy/8.png new file mode 100644 index 0000000..a9689fd Binary files /dev/null and b/public/images/apps/academy/8.png differ diff --git a/public/images/apps/academy/9.png b/public/images/apps/academy/9.png new file mode 100644 index 0000000..b862df7 Binary files /dev/null and b/public/images/apps/academy/9.png differ diff --git a/public/images/apps/academy/hand-with-bulb-dark.png b/public/images/apps/academy/hand-with-bulb-dark.png new file mode 100644 index 0000000..57194b9 Binary files /dev/null and b/public/images/apps/academy/hand-with-bulb-dark.png differ diff --git a/public/images/apps/academy/hand-with-bulb-light.png b/public/images/apps/academy/hand-with-bulb-light.png new file mode 100644 index 0000000..7d525b4 Binary files /dev/null and b/public/images/apps/academy/hand-with-bulb-light.png differ diff --git a/public/images/apps/ecommerce/3d-rocket.png b/public/images/apps/ecommerce/3d-rocket.png new file mode 100644 index 0000000..975b0fd Binary files /dev/null and b/public/images/apps/ecommerce/3d-rocket.png differ diff --git a/public/images/apps/ecommerce/american-express.png b/public/images/apps/ecommerce/american-express.png new file mode 100644 index 0000000..5f867f5 Binary files /dev/null and b/public/images/apps/ecommerce/american-express.png differ diff --git a/public/images/apps/ecommerce/mastercard.png b/public/images/apps/ecommerce/mastercard.png new file mode 100644 index 0000000..c43d17d Binary files /dev/null and b/public/images/apps/ecommerce/mastercard.png differ diff --git a/public/images/apps/ecommerce/paypal.png b/public/images/apps/ecommerce/paypal.png new file mode 100644 index 0000000..1fe70b3 Binary files /dev/null and b/public/images/apps/ecommerce/paypal.png differ diff --git a/public/images/apps/ecommerce/product-1.png b/public/images/apps/ecommerce/product-1.png new file mode 100644 index 0000000..d37b8ff Binary files /dev/null and b/public/images/apps/ecommerce/product-1.png differ diff --git a/public/images/apps/ecommerce/product-10.png b/public/images/apps/ecommerce/product-10.png new file mode 100644 index 0000000..4dfb1cd Binary files /dev/null and b/public/images/apps/ecommerce/product-10.png differ diff --git a/public/images/apps/ecommerce/product-11.png b/public/images/apps/ecommerce/product-11.png new file mode 100644 index 0000000..b5d0a79 Binary files /dev/null and b/public/images/apps/ecommerce/product-11.png differ diff --git a/public/images/apps/ecommerce/product-12.png b/public/images/apps/ecommerce/product-12.png new file mode 100644 index 0000000..6bb75d5 Binary files /dev/null and b/public/images/apps/ecommerce/product-12.png differ diff --git a/public/images/apps/ecommerce/product-13.png b/public/images/apps/ecommerce/product-13.png new file mode 100644 index 0000000..645b0e5 Binary files /dev/null and b/public/images/apps/ecommerce/product-13.png differ diff --git a/public/images/apps/ecommerce/product-14.png b/public/images/apps/ecommerce/product-14.png new file mode 100644 index 0000000..4c712de Binary files /dev/null and b/public/images/apps/ecommerce/product-14.png differ diff --git a/public/images/apps/ecommerce/product-15.png b/public/images/apps/ecommerce/product-15.png new file mode 100644 index 0000000..c352d4d Binary files /dev/null and b/public/images/apps/ecommerce/product-15.png differ diff --git a/public/images/apps/ecommerce/product-16.png b/public/images/apps/ecommerce/product-16.png new file mode 100644 index 0000000..14c70c5 Binary files /dev/null and b/public/images/apps/ecommerce/product-16.png differ diff --git a/public/images/apps/ecommerce/product-17.png b/public/images/apps/ecommerce/product-17.png new file mode 100644 index 0000000..3d119e5 Binary files /dev/null and b/public/images/apps/ecommerce/product-17.png differ diff --git a/public/images/apps/ecommerce/product-18.png b/public/images/apps/ecommerce/product-18.png new file mode 100644 index 0000000..344b4e2 Binary files /dev/null and b/public/images/apps/ecommerce/product-18.png differ diff --git a/public/images/apps/ecommerce/product-19.png b/public/images/apps/ecommerce/product-19.png new file mode 100644 index 0000000..ca86ddd Binary files /dev/null and b/public/images/apps/ecommerce/product-19.png differ diff --git a/public/images/apps/ecommerce/product-2.png b/public/images/apps/ecommerce/product-2.png new file mode 100644 index 0000000..23a4525 Binary files /dev/null and b/public/images/apps/ecommerce/product-2.png differ diff --git a/public/images/apps/ecommerce/product-20.png b/public/images/apps/ecommerce/product-20.png new file mode 100644 index 0000000..76e7f29 Binary files /dev/null and b/public/images/apps/ecommerce/product-20.png differ diff --git a/public/images/apps/ecommerce/product-21.png b/public/images/apps/ecommerce/product-21.png new file mode 100644 index 0000000..c59e099 Binary files /dev/null and b/public/images/apps/ecommerce/product-21.png differ diff --git a/public/images/apps/ecommerce/product-22.png b/public/images/apps/ecommerce/product-22.png new file mode 100644 index 0000000..086046d Binary files /dev/null and b/public/images/apps/ecommerce/product-22.png differ diff --git a/public/images/apps/ecommerce/product-23.png b/public/images/apps/ecommerce/product-23.png new file mode 100644 index 0000000..ae8e48a Binary files /dev/null and b/public/images/apps/ecommerce/product-23.png differ diff --git a/public/images/apps/ecommerce/product-24.png b/public/images/apps/ecommerce/product-24.png new file mode 100644 index 0000000..22910d5 Binary files /dev/null and b/public/images/apps/ecommerce/product-24.png differ diff --git a/public/images/apps/ecommerce/product-25.png b/public/images/apps/ecommerce/product-25.png new file mode 100644 index 0000000..7b9d7f5 Binary files /dev/null and b/public/images/apps/ecommerce/product-25.png differ diff --git a/public/images/apps/ecommerce/product-26.png b/public/images/apps/ecommerce/product-26.png new file mode 100644 index 0000000..a3bec21 Binary files /dev/null and b/public/images/apps/ecommerce/product-26.png differ diff --git a/public/images/apps/ecommerce/product-3.png b/public/images/apps/ecommerce/product-3.png new file mode 100644 index 0000000..80339d6 Binary files /dev/null and b/public/images/apps/ecommerce/product-3.png differ diff --git a/public/images/apps/ecommerce/product-4.png b/public/images/apps/ecommerce/product-4.png new file mode 100644 index 0000000..bcb62c3 Binary files /dev/null and b/public/images/apps/ecommerce/product-4.png differ diff --git a/public/images/apps/ecommerce/product-5.png b/public/images/apps/ecommerce/product-5.png new file mode 100644 index 0000000..e21b168 Binary files /dev/null and b/public/images/apps/ecommerce/product-5.png differ diff --git a/public/images/apps/ecommerce/product-6.png b/public/images/apps/ecommerce/product-6.png new file mode 100644 index 0000000..e35ec7d Binary files /dev/null and b/public/images/apps/ecommerce/product-6.png differ diff --git a/public/images/apps/ecommerce/product-7.png b/public/images/apps/ecommerce/product-7.png new file mode 100644 index 0000000..4305c7f Binary files /dev/null and b/public/images/apps/ecommerce/product-7.png differ diff --git a/public/images/apps/ecommerce/product-8.png b/public/images/apps/ecommerce/product-8.png new file mode 100644 index 0000000..c33ffce Binary files /dev/null and b/public/images/apps/ecommerce/product-8.png differ diff --git a/public/images/apps/ecommerce/product-9.png b/public/images/apps/ecommerce/product-9.png new file mode 100644 index 0000000..4cd355b Binary files /dev/null and b/public/images/apps/ecommerce/product-9.png differ diff --git a/public/images/apps/ecommerce/visa.png b/public/images/apps/ecommerce/visa.png new file mode 100644 index 0000000..8cc7845 Binary files /dev/null and b/public/images/apps/ecommerce/visa.png differ diff --git a/public/images/apps/kanban/plant.png b/public/images/apps/kanban/plant.png new file mode 100644 index 0000000..2d38dfc Binary files /dev/null and b/public/images/apps/kanban/plant.png differ diff --git a/public/images/apps/logistics/fleet-car.png b/public/images/apps/logistics/fleet-car.png new file mode 100644 index 0000000..b12f177 Binary files /dev/null and b/public/images/apps/logistics/fleet-car.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/avatars/10.png b/public/images/avatars/10.png new file mode 100644 index 0000000..6da423b Binary files /dev/null and b/public/images/avatars/10.png differ diff --git a/public/images/avatars/2.png b/public/images/avatars/2.png new file mode 100644 index 0000000..3939eab Binary files /dev/null and b/public/images/avatars/2.png differ diff --git a/public/images/avatars/3.png b/public/images/avatars/3.png new file mode 100644 index 0000000..ed8442d Binary files /dev/null and b/public/images/avatars/3.png differ diff --git a/public/images/avatars/4.png b/public/images/avatars/4.png new file mode 100644 index 0000000..ef0c33f Binary files /dev/null and b/public/images/avatars/4.png differ diff --git a/public/images/avatars/5.png b/public/images/avatars/5.png new file mode 100644 index 0000000..24af4a5 Binary files /dev/null and b/public/images/avatars/5.png differ diff --git a/public/images/avatars/6.png b/public/images/avatars/6.png new file mode 100644 index 0000000..7b33316 Binary files /dev/null and b/public/images/avatars/6.png differ diff --git a/public/images/avatars/7.png b/public/images/avatars/7.png new file mode 100644 index 0000000..96c7107 Binary files /dev/null and b/public/images/avatars/7.png differ diff --git a/public/images/avatars/8.png b/public/images/avatars/8.png new file mode 100644 index 0000000..42ff2ba Binary files /dev/null and b/public/images/avatars/8.png differ diff --git a/public/images/avatars/9.png b/public/images/avatars/9.png new file mode 100644 index 0000000..b4956fb Binary files /dev/null and b/public/images/avatars/9.png differ diff --git a/public/images/cards/1.png b/public/images/cards/1.png new file mode 100644 index 0000000..d8b9056 Binary files /dev/null and b/public/images/cards/1.png differ diff --git a/public/images/cards/2.png b/public/images/cards/2.png new file mode 100644 index 0000000..0eef2c0 Binary files /dev/null and b/public/images/cards/2.png differ diff --git a/public/images/cards/3.png b/public/images/cards/3.png new file mode 100644 index 0000000..9971a2a Binary files /dev/null and b/public/images/cards/3.png differ diff --git a/public/images/cards/4.png b/public/images/cards/4.png new file mode 100644 index 0000000..d93c051 Binary files /dev/null and b/public/images/cards/4.png differ diff --git a/public/images/cards/5.png b/public/images/cards/5.png new file mode 100644 index 0000000..9950c7d Binary files /dev/null and b/public/images/cards/5.png differ diff --git a/public/images/cards/6.png b/public/images/cards/6.png new file mode 100644 index 0000000..7dace12 Binary files /dev/null and b/public/images/cards/6.png differ diff --git a/public/images/cards/amazon-echo-dot.png b/public/images/cards/amazon-echo-dot.png new file mode 100644 index 0000000..c6ba950 Binary files /dev/null and b/public/images/cards/amazon-echo-dot.png differ diff --git a/public/images/cards/apple-iPhone-13.png b/public/images/cards/apple-iPhone-13.png new file mode 100644 index 0000000..6690560 Binary files /dev/null and b/public/images/cards/apple-iPhone-13.png differ diff --git a/public/images/cards/apple-watch-series-7.png b/public/images/cards/apple-watch-series-7.png new file mode 100644 index 0000000..0fbe254 Binary files /dev/null and b/public/images/cards/apple-watch-series-7.png differ diff --git a/public/images/cards/australia.png b/public/images/cards/australia.png new file mode 100644 index 0000000..3314a52 Binary files /dev/null and b/public/images/cards/australia.png differ diff --git a/public/images/cards/beats-studio-2.png b/public/images/cards/beats-studio-2.png new file mode 100644 index 0000000..f9e3e4a Binary files /dev/null and b/public/images/cards/beats-studio-2.png differ diff --git a/public/images/cards/brazil.png b/public/images/cards/brazil.png new file mode 100644 index 0000000..74c5f44 Binary files /dev/null and b/public/images/cards/brazil.png differ diff --git a/public/images/cards/china.png b/public/images/cards/china.png new file mode 100644 index 0000000..4b3a628 Binary files /dev/null and b/public/images/cards/china.png differ diff --git a/public/images/cards/france.png b/public/images/cards/france.png new file mode 100644 index 0000000..e2c6898 Binary files /dev/null and b/public/images/cards/france.png differ diff --git a/public/images/cards/graphic-illustration-1.png b/public/images/cards/graphic-illustration-1.png new file mode 100644 index 0000000..d750388 Binary files /dev/null and b/public/images/cards/graphic-illustration-1.png differ diff --git a/public/images/cards/graphic-illustration-2.png b/public/images/cards/graphic-illustration-2.png new file mode 100644 index 0000000..5ca0591 Binary files /dev/null and b/public/images/cards/graphic-illustration-2.png differ diff --git a/public/images/cards/graphic-illustration-3.png b/public/images/cards/graphic-illustration-3.png new file mode 100644 index 0000000..d3dd72a Binary files /dev/null and b/public/images/cards/graphic-illustration-3.png differ diff --git a/public/images/cards/india.png b/public/images/cards/india.png new file mode 100644 index 0000000..0b96412 Binary files /dev/null and b/public/images/cards/india.png differ diff --git a/public/images/cards/nike-air-jordan.png b/public/images/cards/nike-air-jordan.png new file mode 100644 index 0000000..562de82 Binary files /dev/null and b/public/images/cards/nike-air-jordan.png differ diff --git a/public/images/cards/play-station-console.png b/public/images/cards/play-station-console.png new file mode 100644 index 0000000..38accc4 Binary files /dev/null and b/public/images/cards/play-station-console.png differ diff --git a/public/images/cards/us.png b/public/images/cards/us.png new file mode 100644 index 0000000..9f10107 Binary files /dev/null and b/public/images/cards/us.png differ diff --git a/public/images/front-pages/apple-icon.png b/public/images/front-pages/apple-icon.png new file mode 100644 index 0000000..02b325d Binary files /dev/null and b/public/images/front-pages/apple-icon.png differ diff --git a/public/images/front-pages/checkout.png b/public/images/front-pages/checkout.png new file mode 100644 index 0000000..155fa05 Binary files /dev/null and b/public/images/front-pages/checkout.png differ diff --git a/public/images/front-pages/dropdown-image.png b/public/images/front-pages/dropdown-image.png new file mode 100644 index 0000000..6f19d78 Binary files /dev/null and b/public/images/front-pages/dropdown-image.png differ diff --git a/public/images/front-pages/footer-bg-dark.png b/public/images/front-pages/footer-bg-dark.png new file mode 100644 index 0000000..a4f5edf Binary files /dev/null and b/public/images/front-pages/footer-bg-dark.png differ diff --git a/public/images/front-pages/footer-bg-light.png b/public/images/front-pages/footer-bg-light.png new file mode 100644 index 0000000..f54fab1 Binary files /dev/null and b/public/images/front-pages/footer-bg-light.png differ diff --git a/public/images/front-pages/google-play-icon.png b/public/images/front-pages/google-play-icon.png new file mode 100644 index 0000000..dcd6829 Binary files /dev/null and b/public/images/front-pages/google-play-icon.png differ diff --git a/public/images/front-pages/landing-page/bg-shape.png b/public/images/front-pages/landing-page/bg-shape.png new file mode 100644 index 0000000..6a1b803 Binary files /dev/null and b/public/images/front-pages/landing-page/bg-shape.png differ diff --git a/public/images/front-pages/landing-page/boy-sitting-with-laptop.png b/public/images/front-pages/landing-page/boy-sitting-with-laptop.png new file mode 100644 index 0000000..54fa518 Binary files /dev/null and b/public/images/front-pages/landing-page/boy-sitting-with-laptop.png differ diff --git a/public/images/front-pages/landing-page/chris.png b/public/images/front-pages/landing-page/chris.png new file mode 100644 index 0000000..f948ae4 Binary files /dev/null and b/public/images/front-pages/landing-page/chris.png differ diff --git a/public/images/front-pages/landing-page/contact-border.png b/public/images/front-pages/landing-page/contact-border.png new file mode 100644 index 0000000..2f894a4 Binary files /dev/null and b/public/images/front-pages/landing-page/contact-border.png differ diff --git a/public/images/front-pages/landing-page/crm-dashboard.png b/public/images/front-pages/landing-page/crm-dashboard.png new file mode 100644 index 0000000..566b047 Binary files /dev/null and b/public/images/front-pages/landing-page/crm-dashboard.png differ diff --git a/public/images/front-pages/landing-page/customer-service.png b/public/images/front-pages/landing-page/customer-service.png new file mode 100644 index 0000000..3e09eeb Binary files /dev/null and b/public/images/front-pages/landing-page/customer-service.png differ diff --git a/public/images/front-pages/landing-page/get-started-bg-dark.png b/public/images/front-pages/landing-page/get-started-bg-dark.png new file mode 100644 index 0000000..806703d Binary files /dev/null and b/public/images/front-pages/landing-page/get-started-bg-dark.png differ diff --git a/public/images/front-pages/landing-page/get-started-bg-light.png b/public/images/front-pages/landing-page/get-started-bg-light.png new file mode 100644 index 0000000..5e09f76 Binary files /dev/null and b/public/images/front-pages/landing-page/get-started-bg-light.png differ diff --git a/public/images/front-pages/landing-page/hero-bg-dark.png b/public/images/front-pages/landing-page/hero-bg-dark.png new file mode 100644 index 0000000..37af33e Binary files /dev/null and b/public/images/front-pages/landing-page/hero-bg-dark.png differ diff --git a/public/images/front-pages/landing-page/hero-bg-light.png b/public/images/front-pages/landing-page/hero-bg-light.png new file mode 100644 index 0000000..37af33e Binary files /dev/null and b/public/images/front-pages/landing-page/hero-bg-light.png differ diff --git a/public/images/front-pages/landing-page/hero-dashboard-dark.png b/public/images/front-pages/landing-page/hero-dashboard-dark.png new file mode 100644 index 0000000..c2a4011 Binary files /dev/null and b/public/images/front-pages/landing-page/hero-dashboard-dark.png differ diff --git a/public/images/front-pages/landing-page/hero-dashboard-light.png b/public/images/front-pages/landing-page/hero-dashboard-light.png new file mode 100644 index 0000000..160590e Binary files /dev/null and b/public/images/front-pages/landing-page/hero-dashboard-light.png differ diff --git a/public/images/front-pages/landing-page/hero-elements-dark.png b/public/images/front-pages/landing-page/hero-elements-dark.png new file mode 100644 index 0000000..1e0945d Binary files /dev/null and b/public/images/front-pages/landing-page/hero-elements-dark.png differ diff --git a/public/images/front-pages/landing-page/hero-elements-light.png b/public/images/front-pages/landing-page/hero-elements-light.png new file mode 100644 index 0000000..8061b82 Binary files /dev/null and b/public/images/front-pages/landing-page/hero-elements-light.png differ diff --git a/public/images/front-pages/landing-page/join-community-arrow.png b/public/images/front-pages/landing-page/join-community-arrow.png new file mode 100644 index 0000000..76b5c0e Binary files /dev/null and b/public/images/front-pages/landing-page/join-community-arrow.png differ diff --git a/public/images/front-pages/landing-page/nannie.png b/public/images/front-pages/landing-page/nannie.png new file mode 100644 index 0000000..3dcc8b8 Binary files /dev/null and b/public/images/front-pages/landing-page/nannie.png differ diff --git a/public/images/front-pages/landing-page/paul.png b/public/images/front-pages/landing-page/paul.png new file mode 100644 index 0000000..ea9fe16 Binary files /dev/null and b/public/images/front-pages/landing-page/paul.png differ diff --git a/public/images/front-pages/landing-page/pricing-arrow.png b/public/images/front-pages/landing-page/pricing-arrow.png new file mode 100644 index 0000000..330c919 Binary files /dev/null and b/public/images/front-pages/landing-page/pricing-arrow.png differ diff --git a/public/images/front-pages/landing-page/pricing-basic.png b/public/images/front-pages/landing-page/pricing-basic.png new file mode 100644 index 0000000..73fa7d4 Binary files /dev/null and b/public/images/front-pages/landing-page/pricing-basic.png differ diff --git a/public/images/front-pages/landing-page/pricing-enterprise.png b/public/images/front-pages/landing-page/pricing-enterprise.png new file mode 100644 index 0000000..f16689d Binary files /dev/null and b/public/images/front-pages/landing-page/pricing-enterprise.png differ diff --git a/public/images/front-pages/landing-page/pricing-team.png b/public/images/front-pages/landing-page/pricing-team.png new file mode 100644 index 0000000..1ba86be Binary files /dev/null and b/public/images/front-pages/landing-page/pricing-team.png differ diff --git a/public/images/front-pages/landing-page/sophie.png b/public/images/front-pages/landing-page/sophie.png new file mode 100644 index 0000000..b64b216 Binary files /dev/null and b/public/images/front-pages/landing-page/sophie.png differ diff --git a/public/images/front-pages/product.png b/public/images/front-pages/product.png new file mode 100644 index 0000000..4dcc3bd Binary files /dev/null and b/public/images/front-pages/product.png differ diff --git a/public/images/icons/doc.png b/public/images/icons/doc.png new file mode 100644 index 0000000..ccb74aa Binary files /dev/null and b/public/images/icons/doc.png differ diff --git a/public/images/icons/js.png b/public/images/icons/js.png new file mode 100644 index 0000000..73f0e46 Binary files /dev/null and b/public/images/icons/js.png differ diff --git a/public/images/icons/mobile-bg.png b/public/images/icons/mobile-bg.png new file mode 100644 index 0000000..0f88de4 Binary files /dev/null and b/public/images/icons/mobile-bg.png differ diff --git a/public/images/icons/pdf-document.png b/public/images/icons/pdf-document.png new file mode 100644 index 0000000..ad21749 Binary files /dev/null and b/public/images/icons/pdf-document.png differ diff --git a/public/images/icons/pdf.png b/public/images/icons/pdf.png new file mode 100644 index 0000000..3f1f3e0 Binary files /dev/null and b/public/images/icons/pdf.png differ diff --git a/public/images/icons/social-bg.png b/public/images/icons/social-bg.png new file mode 100644 index 0000000..3e2b0f6 Binary files /dev/null and b/public/images/icons/social-bg.png differ diff --git a/public/images/icons/support-bg.png b/public/images/icons/support-bg.png new file mode 100644 index 0000000..64c0e2e Binary files /dev/null and b/public/images/icons/support-bg.png differ diff --git a/public/images/icons/txt.png b/public/images/icons/txt.png new file mode 100644 index 0000000..14638d7 Binary files /dev/null and b/public/images/icons/txt.png differ diff --git a/public/images/icons/xls.png b/public/images/icons/xls.png new file mode 100644 index 0000000..8a3cd8f Binary files /dev/null and b/public/images/icons/xls.png differ diff --git a/public/images/illustrations/auth/v2-forgot-password-dark.png b/public/images/illustrations/auth/v2-forgot-password-dark.png new file mode 100644 index 0000000..dfaf43c Binary files /dev/null and b/public/images/illustrations/auth/v2-forgot-password-dark.png differ diff --git a/public/images/illustrations/auth/v2-forgot-password-light.png b/public/images/illustrations/auth/v2-forgot-password-light.png new file mode 100644 index 0000000..49d43b0 Binary files /dev/null and b/public/images/illustrations/auth/v2-forgot-password-light.png differ diff --git a/public/images/illustrations/auth/v2-login-dark-border.png b/public/images/illustrations/auth/v2-login-dark-border.png new file mode 100644 index 0000000..28c730d Binary files /dev/null and b/public/images/illustrations/auth/v2-login-dark-border.png differ diff --git a/public/images/illustrations/auth/v2-login-dark.png b/public/images/illustrations/auth/v2-login-dark.png new file mode 100644 index 0000000..37fa2d0 Binary files /dev/null and b/public/images/illustrations/auth/v2-login-dark.png differ diff --git a/public/images/illustrations/auth/v2-login-light-border.png b/public/images/illustrations/auth/v2-login-light-border.png new file mode 100644 index 0000000..5a2fe55 Binary files /dev/null and b/public/images/illustrations/auth/v2-login-light-border.png differ diff --git a/public/images/illustrations/auth/v2-login-light.png b/public/images/illustrations/auth/v2-login-light.png new file mode 100644 index 0000000..ddfd971 Binary files /dev/null and b/public/images/illustrations/auth/v2-login-light.png differ diff --git a/public/images/illustrations/auth/v2-register-dark-border.png b/public/images/illustrations/auth/v2-register-dark-border.png new file mode 100644 index 0000000..2a3de64 Binary files /dev/null and b/public/images/illustrations/auth/v2-register-dark-border.png differ diff --git a/public/images/illustrations/auth/v2-register-dark.png b/public/images/illustrations/auth/v2-register-dark.png new file mode 100644 index 0000000..f6a621d Binary files /dev/null and b/public/images/illustrations/auth/v2-register-dark.png differ diff --git a/public/images/illustrations/auth/v2-register-light-border.png b/public/images/illustrations/auth/v2-register-light-border.png new file mode 100644 index 0000000..b7a08ec Binary files /dev/null and b/public/images/illustrations/auth/v2-register-light-border.png differ diff --git a/public/images/illustrations/auth/v2-register-light.png b/public/images/illustrations/auth/v2-register-light.png new file mode 100644 index 0000000..520514c Binary files /dev/null and b/public/images/illustrations/auth/v2-register-light.png differ diff --git a/public/images/illustrations/auth/v2-reset-password-dark.png b/public/images/illustrations/auth/v2-reset-password-dark.png new file mode 100644 index 0000000..63fd2c0 Binary files /dev/null and b/public/images/illustrations/auth/v2-reset-password-dark.png differ diff --git a/public/images/illustrations/auth/v2-reset-password-light.png b/public/images/illustrations/auth/v2-reset-password-light.png new file mode 100644 index 0000000..0faf6eb Binary files /dev/null and b/public/images/illustrations/auth/v2-reset-password-light.png differ diff --git a/public/images/illustrations/auth/v2-two-steps-dark.png b/public/images/illustrations/auth/v2-two-steps-dark.png new file mode 100644 index 0000000..d7e169e Binary files /dev/null and b/public/images/illustrations/auth/v2-two-steps-dark.png differ diff --git a/public/images/illustrations/auth/v2-two-steps-light.png b/public/images/illustrations/auth/v2-two-steps-light.png new file mode 100644 index 0000000..a8977ab Binary files /dev/null and b/public/images/illustrations/auth/v2-two-steps-light.png differ diff --git a/public/images/illustrations/auth/v2-verify-email-dark.png b/public/images/illustrations/auth/v2-verify-email-dark.png new file mode 100644 index 0000000..86edbc8 Binary files /dev/null and b/public/images/illustrations/auth/v2-verify-email-dark.png differ diff --git a/public/images/illustrations/auth/v2-verify-email-light.png b/public/images/illustrations/auth/v2-verify-email-light.png new file mode 100644 index 0000000..9baab35 Binary files /dev/null and b/public/images/illustrations/auth/v2-verify-email-light.png differ diff --git a/public/images/illustrations/characters-with-objects/1.png b/public/images/illustrations/characters-with-objects/1.png new file mode 100644 index 0000000..615d6e6 Binary files /dev/null and b/public/images/illustrations/characters-with-objects/1.png differ diff --git a/public/images/illustrations/characters-with-objects/2.png b/public/images/illustrations/characters-with-objects/2.png new file mode 100644 index 0000000..f8efbb0 Binary files /dev/null and b/public/images/illustrations/characters-with-objects/2.png differ diff --git a/public/images/illustrations/characters/1.png b/public/images/illustrations/characters/1.png new file mode 100644 index 0000000..7d7d8c6 Binary files /dev/null and b/public/images/illustrations/characters/1.png differ diff --git a/public/images/illustrations/characters/2.png b/public/images/illustrations/characters/2.png new file mode 100644 index 0000000..3b02b79 Binary files /dev/null and b/public/images/illustrations/characters/2.png differ diff --git a/public/images/illustrations/characters/3.png b/public/images/illustrations/characters/3.png new file mode 100644 index 0000000..97a6d93 Binary files /dev/null and b/public/images/illustrations/characters/3.png differ diff --git a/public/images/illustrations/characters/4.png b/public/images/illustrations/characters/4.png new file mode 100644 index 0000000..3a46e6c Binary files /dev/null and b/public/images/illustrations/characters/4.png differ diff --git a/public/images/illustrations/characters/5.png b/public/images/illustrations/characters/5.png new file mode 100644 index 0000000..88b1cf5 Binary files /dev/null and b/public/images/illustrations/characters/5.png differ diff --git a/public/images/illustrations/characters/6.png b/public/images/illustrations/characters/6.png new file mode 100644 index 0000000..cd4ca2b Binary files /dev/null and b/public/images/illustrations/characters/6.png differ diff --git a/public/images/illustrations/characters/7.png b/public/images/illustrations/characters/7.png new file mode 100644 index 0000000..84751c7 Binary files /dev/null and b/public/images/illustrations/characters/7.png differ diff --git a/public/images/illustrations/characters/8.png b/public/images/illustrations/characters/8.png new file mode 100644 index 0000000..f2cffe4 Binary files /dev/null and b/public/images/illustrations/characters/8.png differ diff --git a/public/images/illustrations/characters/9.png b/public/images/illustrations/characters/9.png new file mode 100644 index 0000000..f79bd7e Binary files /dev/null and b/public/images/illustrations/characters/9.png differ diff --git a/public/images/illustrations/objects/pricing-basic.png b/public/images/illustrations/objects/pricing-basic.png new file mode 100644 index 0000000..f9c57b8 Binary files /dev/null and b/public/images/illustrations/objects/pricing-basic.png differ diff --git a/public/images/illustrations/objects/pricing-enterprise.png b/public/images/illustrations/objects/pricing-enterprise.png new file mode 100644 index 0000000..87eded2 Binary files /dev/null and b/public/images/illustrations/objects/pricing-enterprise.png differ diff --git a/public/images/illustrations/objects/pricing-standard.png b/public/images/illustrations/objects/pricing-standard.png new file mode 100644 index 0000000..fa3fd9e Binary files /dev/null and b/public/images/illustrations/objects/pricing-standard.png differ diff --git a/public/images/logos/american-express.png b/public/images/logos/american-express.png new file mode 100644 index 0000000..33e5af6 Binary files /dev/null and b/public/images/logos/american-express.png differ diff --git a/public/images/logos/angular.png b/public/images/logos/angular.png new file mode 100644 index 0000000..219d1d5 Binary files /dev/null and b/public/images/logos/angular.png differ diff --git a/public/images/logos/asana.png b/public/images/logos/asana.png new file mode 100644 index 0000000..09fbe0c Binary files /dev/null and b/public/images/logos/asana.png differ diff --git a/public/images/logos/aws.png b/public/images/logos/aws.png new file mode 100644 index 0000000..99225c1 Binary files /dev/null and b/public/images/logos/aws.png differ diff --git a/public/images/logos/behance.png b/public/images/logos/behance.png new file mode 100644 index 0000000..03957b2 Binary files /dev/null and b/public/images/logos/behance.png differ diff --git a/public/images/logos/bootstrap.png b/public/images/logos/bootstrap.png new file mode 100644 index 0000000..2c45224 Binary files /dev/null and b/public/images/logos/bootstrap.png differ diff --git a/public/images/logos/brave.png b/public/images/logos/brave.png new file mode 100644 index 0000000..dde58eb Binary files /dev/null and b/public/images/logos/brave.png differ diff --git a/public/images/logos/chrome.png b/public/images/logos/chrome.png new file mode 100644 index 0000000..79d2de4 Binary files /dev/null and b/public/images/logos/chrome.png differ diff --git a/public/images/logos/dinners-club.png b/public/images/logos/dinners-club.png new file mode 100644 index 0000000..1c7bac2 Binary files /dev/null and b/public/images/logos/dinners-club.png differ diff --git a/public/images/logos/dribbble.png b/public/images/logos/dribbble.png new file mode 100644 index 0000000..d91142d Binary files /dev/null and b/public/images/logos/dribbble.png differ diff --git a/public/images/logos/event-bg.png b/public/images/logos/event-bg.png new file mode 100644 index 0000000..c9eb33c Binary files /dev/null and b/public/images/logos/event-bg.png differ diff --git a/public/images/logos/facebook.png b/public/images/logos/facebook.png new file mode 100644 index 0000000..a302753 Binary files /dev/null and b/public/images/logos/facebook.png differ diff --git a/public/images/logos/figma-bg.png b/public/images/logos/figma-bg.png new file mode 100644 index 0000000..75aed07 Binary files /dev/null and b/public/images/logos/figma-bg.png differ diff --git a/public/images/logos/figma.png b/public/images/logos/figma.png new file mode 100644 index 0000000..0d39540 Binary files /dev/null and b/public/images/logos/figma.png differ diff --git a/public/images/logos/firebase.png b/public/images/logos/firebase.png new file mode 100644 index 0000000..4a07e69 Binary files /dev/null and b/public/images/logos/firebase.png differ diff --git a/public/images/logos/github.png b/public/images/logos/github.png new file mode 100644 index 0000000..95199b3 Binary files /dev/null and b/public/images/logos/github.png differ diff --git a/public/images/logos/google-chrome.png b/public/images/logos/google-chrome.png new file mode 100644 index 0000000..15b93c3 Binary files /dev/null and b/public/images/logos/google-chrome.png differ diff --git a/public/images/logos/google.png b/public/images/logos/google.png new file mode 100644 index 0000000..ec0e380 Binary files /dev/null and b/public/images/logos/google.png differ diff --git a/public/images/logos/html-bg.png b/public/images/logos/html-bg.png new file mode 100644 index 0000000..e424b6e Binary files /dev/null and b/public/images/logos/html-bg.png differ diff --git a/public/images/logos/internet-explorer.png b/public/images/logos/internet-explorer.png new file mode 100644 index 0000000..7070eb6 Binary files /dev/null and b/public/images/logos/internet-explorer.png differ diff --git a/public/images/logos/jcb.png b/public/images/logos/jcb.png new file mode 100644 index 0000000..11cb538 Binary files /dev/null and b/public/images/logos/jcb.png differ diff --git a/public/images/logos/laravel.png b/public/images/logos/laravel.png new file mode 100644 index 0000000..3b82274 Binary files /dev/null and b/public/images/logos/laravel.png differ diff --git a/public/images/logos/linkedin.png b/public/images/logos/linkedin.png new file mode 100644 index 0000000..2e2114c Binary files /dev/null and b/public/images/logos/linkedin.png differ diff --git a/public/images/logos/mailchimp.png b/public/images/logos/mailchimp.png new file mode 100644 index 0000000..b453865 Binary files /dev/null and b/public/images/logos/mailchimp.png differ diff --git a/public/images/logos/mastercard.png b/public/images/logos/mastercard.png new file mode 100644 index 0000000..6682dff Binary files /dev/null and b/public/images/logos/mastercard.png differ diff --git a/public/images/logos/mozilla-firefox.png b/public/images/logos/mozilla-firefox.png new file mode 100644 index 0000000..b80705f Binary files /dev/null and b/public/images/logos/mozilla-firefox.png differ diff --git a/public/images/logos/opera-mini.png b/public/images/logos/opera-mini.png new file mode 100644 index 0000000..51a42f2 Binary files /dev/null and b/public/images/logos/opera-mini.png differ diff --git a/public/images/logos/paypal.png b/public/images/logos/paypal.png new file mode 100644 index 0000000..fb801af Binary files /dev/null and b/public/images/logos/paypal.png differ diff --git a/public/images/logos/python-bg.png b/public/images/logos/python-bg.png new file mode 100644 index 0000000..1a51425 Binary files /dev/null and b/public/images/logos/python-bg.png differ diff --git a/public/images/logos/react-bg.png b/public/images/logos/react-bg.png new file mode 100644 index 0000000..ce93795 Binary files /dev/null and b/public/images/logos/react-bg.png differ diff --git a/public/images/logos/react.png b/public/images/logos/react.png new file mode 100644 index 0000000..fd7e283 Binary files /dev/null and b/public/images/logos/react.png differ diff --git a/public/images/logos/safari.png b/public/images/logos/safari.png new file mode 100644 index 0000000..8d69f4c Binary files /dev/null and b/public/images/logos/safari.png differ diff --git a/public/images/logos/sketch-bg.png b/public/images/logos/sketch-bg.png new file mode 100644 index 0000000..54c135a Binary files /dev/null and b/public/images/logos/sketch-bg.png differ diff --git a/public/images/logos/sketch.png b/public/images/logos/sketch.png new file mode 100644 index 0000000..cba36ae Binary files /dev/null and b/public/images/logos/sketch.png differ diff --git a/public/images/logos/slack.png b/public/images/logos/slack.png new file mode 100644 index 0000000..97580d8 Binary files /dev/null and b/public/images/logos/slack.png differ diff --git a/public/images/logos/twitter-bg.png b/public/images/logos/twitter-bg.png new file mode 100644 index 0000000..3739937 Binary files /dev/null and b/public/images/logos/twitter-bg.png differ diff --git a/public/images/logos/twitter.png b/public/images/logos/twitter.png new file mode 100644 index 0000000..22e077e Binary files /dev/null and b/public/images/logos/twitter.png differ diff --git a/public/images/logos/visa.png b/public/images/logos/visa.png new file mode 100644 index 0000000..75fbda3 Binary files /dev/null and b/public/images/logos/visa.png differ diff --git a/public/images/logos/vue-bg.png b/public/images/logos/vue-bg.png new file mode 100644 index 0000000..9bfccc2 Binary files /dev/null and b/public/images/logos/vue-bg.png differ diff --git a/public/images/logos/vue.png b/public/images/logos/vue.png new file mode 100644 index 0000000..98ab7f6 Binary files /dev/null and b/public/images/logos/vue.png differ diff --git a/public/images/logos/xd-bg.png b/public/images/logos/xd-bg.png new file mode 100644 index 0000000..6c4b5e0 Binary files /dev/null and b/public/images/logos/xd-bg.png differ diff --git a/public/images/misc/barcode.png b/public/images/misc/barcode.png new file mode 100644 index 0000000..0ca8189 Binary files /dev/null and b/public/images/misc/barcode.png differ diff --git a/public/images/pages/auth-mask-dark.png b/public/images/pages/auth-mask-dark.png new file mode 100644 index 0000000..985e22a Binary files /dev/null and b/public/images/pages/auth-mask-dark.png differ diff --git a/public/images/pages/auth-mask-light.png b/public/images/pages/auth-mask-light.png new file mode 100644 index 0000000..1106ea1 Binary files /dev/null and b/public/images/pages/auth-mask-light.png differ diff --git a/public/images/pages/auth-reg-multi-mask-dark.png b/public/images/pages/auth-reg-multi-mask-dark.png new file mode 100644 index 0000000..37da037 Binary files /dev/null and b/public/images/pages/auth-reg-multi-mask-dark.png differ diff --git a/public/images/pages/auth-reg-multi-mask-light.png b/public/images/pages/auth-reg-multi-mask-light.png new file mode 100644 index 0000000..e073bbf Binary files /dev/null and b/public/images/pages/auth-reg-multi-mask-light.png differ diff --git a/public/images/pages/create-deal-type-dark.png b/public/images/pages/create-deal-type-dark.png new file mode 100644 index 0000000..dce75e4 Binary files /dev/null and b/public/images/pages/create-deal-type-dark.png differ diff --git a/public/images/pages/create-deal-type-light.png b/public/images/pages/create-deal-type-light.png new file mode 100644 index 0000000..e0cecf9 Binary files /dev/null and b/public/images/pages/create-deal-type-light.png differ diff --git a/public/images/pages/faq-header.png b/public/images/pages/faq-header.png new file mode 100644 index 0000000..cdcf8bb Binary files /dev/null and b/public/images/pages/faq-header.png differ diff --git a/public/images/pages/google-home.png b/public/images/pages/google-home.png new file mode 100644 index 0000000..0de991b Binary files /dev/null and b/public/images/pages/google-home.png differ diff --git a/public/images/pages/iPhone-11.png b/public/images/pages/iPhone-11.png new file mode 100644 index 0000000..e0f4b6c Binary files /dev/null and b/public/images/pages/iPhone-11.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..ec41f7e 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..f91d9fe Binary files /dev/null and b/public/images/pages/misc-mask-light.png differ diff --git a/public/images/pages/profile-banner.png b/public/images/pages/profile-banner.png new file mode 100644 index 0000000..dffdc54 Binary files /dev/null and b/public/images/pages/profile-banner.png differ diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..d2f8422 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/@core/components/custom-inputs/Horizontal.tsx b/src/@core/components/custom-inputs/Horizontal.tsx new file mode 100644 index 0000000..61cbfb9 --- /dev/null +++ b/src/@core/components/custom-inputs/Horizontal.tsx @@ -0,0 +1,147 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' +import Radio from '@mui/material/Radio' +import Checkbox from '@mui/material/Checkbox' +import Typography from '@mui/material/Typography' +import { styled } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { CustomInputHorizontalProps } from './types' + +const Root = styled('div', { + name: 'MuiCustomInputHorizontal', + slot: 'root' +})(({ theme }) => ({ + blockSize: '100%', + display: 'flex', + gap: theme.spacing(1), + borderRadius: 'var(--mui-shape-borderRadius)', + cursor: 'pointer', + position: 'relative', + alignItems: 'flex-start', + border: '1px solid var(--mui-palette-customColors-inputBorder)', + padding: theme.spacing(4), + color: 'var(--mui-palette-text-primary)', + transition: theme.transitions.create(['border-color'], { + duration: theme.transitions.duration.shorter + }), + + '&:hover': { + borderColor: 'var(--mui-palette-action-active)' + }, + '&.active': { + borderColor: 'var(--mui-palette-primary-main)', + '& i, & svg': { + color: 'var(--mui-palette-primary-main) !important' + } + } +})) + +const Title = styled(Typography, { + name: 'MuiCustomInputHorizontal', + slot: 'title' +})(({ theme }) => ({ + fontWeight: theme.typography.fontWeightMedium, + color: 'var(--mui-palette-text-primary) !important' +})) + +const Meta = styled(Typography, { + name: 'MuiCustomInputHorizontal', + slot: 'meta' +})(({ theme }) => ({ + ...theme.typography.body2, + color: 'var(--mui-palette-text-disabled) !important' +})) + +const Content = styled(Typography, { + name: 'MuiCustomInputHorizontal', + slot: 'content' +})(({ theme }) => ({ + ...theme.typography.body2 +})) + +const RadioInput = styled(Radio, { + name: 'MuiCustomInputHorizontal', + slot: 'input' +})(({ theme }) => ({ + marginBlockStart: theme.spacing(-0.25), + marginInlineStart: theme.spacing(-0.25) +})) + +const CheckboxInput = styled(Checkbox, { + name: 'MuiCustomInputHorizontal', + slot: 'input' +})(({ theme }) => ({ + marginBlockStart: theme.spacing(-0.25), + marginInlineStart: theme.spacing(-0.25) +})) + +const CustomInputHorizontal = (props: CustomInputHorizontalProps) => { + // Props + const { type, data, name, selected, gridProps, handleChange, color = 'primary' } = props + + // Vars + 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 + } + } + + return data ? ( + + handleChange(value)} + className={classnames({ + active: type === 'radio' ? selected === value : selected.includes(value) + })} + > + {type === 'radio' ? ( + + ) : ( + handleChange(value)} + /> + )} + {renderData()} + + + ) : null +} + +export default CustomInputHorizontal diff --git a/src/@core/components/custom-inputs/Image.tsx b/src/@core/components/custom-inputs/Image.tsx new file mode 100644 index 0000000..22accfa --- /dev/null +++ b/src/@core/components/custom-inputs/Image.tsx @@ -0,0 +1,82 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' +import Checkbox from '@mui/material/Checkbox' +import { styled } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { CustomInputImgProps } from './types' + +const Root = styled('div', { + name: 'MuiCustomImage', + slot: 'Root' +})({ + blockSize: '100%', + display: 'flex', + borderRadius: 'var(--mui-shape-borderRadius)', + cursor: 'pointer', + overflow: 'hidden', + position: 'relative', + alignItems: 'center', + flexDirection: 'column', + justifyContent: 'center', + border: '1px solid var(--mui-palette-divider)', + + '&:hover': { + borderColor: 'var(--mui-palette-action-active)' + }, + '&.active': { + borderColor: 'var(--mui-palette-primary-main)' + }, + '&:not(.active):not(:hover) .MuiCheckbox-root': { + display: 'none' + } +}) + +const CheckboxInput = styled(Checkbox, { + name: 'MuiCustomImage', + slot: 'Input' +})({ + top: 7, + right: 7, + position: 'absolute' +}) + +const Image = styled('img', { + name: 'MuiCustomImage', + slot: 'Image' +})({ + maxWidth: '100%' +}) + +const CustomCheckboxImg = (props: CustomInputImgProps) => { + // Props + const { type, data, name, selected, gridProps, handleChange, color = 'primary' } = props + + // Vars + const { alt, img, value } = data + + const renderComponent = () => { + return ( + + handleChange(value)}> + {typeof img === 'string' ? {alt : img} + {type === 'radio' ? null : ( + handleChange(value)} + /> + )} + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomCheckboxImg diff --git a/src/@core/components/custom-inputs/Vertical.tsx b/src/@core/components/custom-inputs/Vertical.tsx new file mode 100644 index 0000000..d6b73d3 --- /dev/null +++ b/src/@core/components/custom-inputs/Vertical.tsx @@ -0,0 +1,119 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' +import Radio from '@mui/material/Radio' +import Checkbox from '@mui/material/Checkbox' +import Typography from '@mui/material/Typography' +import { styled } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { CustomInputVerticalProps } from './types' + +const Root = styled('div', { + name: 'MuiCustomInputVertical', + slot: 'root' +})(({ theme }) => ({ + display: 'flex', + blockSize: '100%', + cursor: 'pointer', + position: 'relative', + alignItems: 'center', + gap: theme.spacing(2), + flexDirection: 'column', + padding: theme.spacing(4), + borderRadius: 'var(--mui-shape-borderRadius)', + border: '1px solid var(--mui-palette-customColors-inputBorder)', + color: 'var(--mui-palette-text-primary)', + transition: theme.transitions.create(['border-color'], { + duration: theme.transitions.duration.shorter + }), + + '&:hover': { + borderColor: 'var(--mui-palette-action-active)' + }, + '&.active': { + borderColor: 'var(--mui-palette-primary-main)', + '& > svg, & > i': { + color: 'var(--mui-palette-primary-main) !important' + } + }, + '&.radio-only .MuiRadio-root': { + marginTop: theme.spacing(-2) + }, + '&.checkbox-only .MuiCheckbox-root': { + marginTop: theme.spacing(-2) + } +})) + +const Title = styled(Typography, { + name: 'MuiCustomInputVertical', + slot: 'title' +})(({ theme }) => ({ + fontWeight: theme.typography.fontWeightMedium, + color: 'var(--mui-palette-text-primary) !important' +})) + +const Content = styled(Typography, { + name: 'MuiCustomInputVertical', + slot: 'content' +})(({ theme }) => ({ + ...theme.typography.body2, + textAlign: 'center' +})) + +const RadioInput = styled(Radio, { + name: 'MuiCustomInputVertical', + slot: 'input' +})(({ theme }) => ({ + marginBottom: theme.spacing(-2) +})) + +const CheckboxInput = styled(Checkbox, { + name: 'MuiCustomInputVertical', + slot: 'input' +})(({ theme }) => ({ + marginBottom: theme.spacing(-2) +})) + +const CustomInputVertical = (props: CustomInputVerticalProps) => { + // Props + const { type, data, name, selected, gridProps, handleChange, color = 'primary' } = props + + // Vars + const { title, value, content, asset } = data + + const renderComponent = () => { + return ( + + handleChange(value)} + className={classnames({ + 'radio-only': type === 'radio' && !asset && !title && !content, + 'checkbox-only': type === 'checkbox' && !asset && !title && !content, + active: type === 'radio' ? selected === value : selected.includes(value) + })} + > + {asset || null} + {title ? typeof title === 'string' ? {title} : title : null} + {content ? typeof content === 'string' ? {content} : content : null} + {type === 'radio' ? ( + + ) : ( + handleChange(value)} + /> + )} + + + ) + } + + return data ? renderComponent() : null +} + +export default CustomInputVertical diff --git a/src/@core/components/custom-inputs/types.ts b/src/@core/components/custom-inputs/types.ts new file mode 100644 index 0000000..5e2ecf2 --- /dev/null +++ b/src/@core/components/custom-inputs/types.ts @@ -0,0 +1,96 @@ +// React Imports +import type { ChangeEvent, ReactNode } from 'react' + +// MUI Imports +import type { Grid2Props } from '@mui/material/Grid2' + +// Type Imports +import type { ThemeColor } from '@core/types' + +// Types of Horizontal Custom Inputs +export type CustomInputHorizontalData = { + value: string + content?: ReactNode + isSelected?: boolean +} & ( + | { + meta: ReactNode + title: ReactNode + } + | { + meta?: never + title?: never + } + | { + title: ReactNode + meta?: never + } +) +export type CustomInputHorizontalProps = { + name: string + color?: ThemeColor + gridProps?: Grid2Props + data: CustomInputHorizontalData +} & ( + | { + type: 'checkbox' + selected: string[] + handleChange: (value: string) => void + } + | { + type: 'radio' + selected: string + handleChange: (value: string | ChangeEvent) => void + } +) + +// Types of Vertical Custom Inputs +export type CustomInputVerticalData = { + value: string + title?: ReactNode + content?: ReactNode + isSelected?: boolean + asset?: ReactNode +} +export type CustomInputVerticalProps = { + name: string + color?: ThemeColor + gridProps?: Grid2Props + data: CustomInputVerticalData +} & ( + | { + type: 'checkbox' + selected: string[] + handleChange: (value: string) => void + } + | { + type: 'radio' + selected: string + handleChange: (value: string | ChangeEvent) => void + } +) + +// Types of Custom Inputs with Images +export type CustomInputImgData = { + alt?: string + value: string + img: ReactNode + isSelected?: boolean +} +export type CustomInputImgProps = { + name: string + color?: ThemeColor + gridProps: Grid2Props + data: CustomInputImgData +} & ( + | { + type: 'checkbox' + selected: string[] + handleChange: (value: string) => void + } + | { + type: 'radio' + selected: string + handleChange: (value: 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..d80c9c3 --- /dev/null +++ b/src/@core/components/customizer/index.tsx @@ -0,0 +1,486 @@ +'use client' + +// React Imports +import { useRef, useState } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' +import Link from 'next/link' + +// MUI Imports +import Chip from '@mui/material/Chip' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import Popper from '@mui/material/Popper' +import { useTheme } from '@mui/material/styles' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import Switch from '@mui/material/Switch' +import type { Breakpoint } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' +import { useDebounce, useMedia } from 'react-use' +import { HexColorPicker, HexColorInput } from 'react-colorful' +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { Settings } from '@core/contexts/settingsContext' +import type { Direction } from '@core/types' +import type { PrimaryColorConfig } from '@configs/primaryColorConfig' + +// Icon Imports +import SkinDefault from '@core/svg/SkinDefault' +import SkinBordered from '@core/svg/SkinBordered' +import LayoutVertical from '@core/svg/LayoutVertical' +import LayoutCollapsed from '@core/svg/LayoutCollapsed' +import LayoutHorizontal from '@core/svg/LayoutHorizontal' +import ContentCompact from '@core/svg/ContentCompact' +import ContentWide from '@core/svg/ContentWide' +import DirectionLtr from '@core/svg/DirectionLtr' +import DirectionRtl from '@core/svg/DirectionRtl' + +// Config Imports +import primaryColorConfig from '@configs/primaryColorConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Style Imports +import styles from './styles.module.css' + +type CustomizerProps = { + breakpoint?: Breakpoint | 'xxl' | `${number}px` | `${number}rem` | `${number}em` + dir?: Direction + disableDirection?: boolean +} + +const getLocalePath = (pathName: string, locale: string) => { + if (!pathName) return '/' + const segments = pathName.split('/') + + segments[1] = locale + + return segments.join('/') +} + +type DebouncedColorPickerProps = { + settings: Settings + isColorFromPrimaryConfig: PrimaryColorConfig | undefined + handleChange: (field: keyof Settings | 'primaryColor', value: Settings[keyof Settings] | string) => void +} + +const DebouncedColorPicker = (props: DebouncedColorPickerProps) => { + // Props + const { settings, isColorFromPrimaryConfig, handleChange } = props + + // States + const [debouncedColor, setDebouncedColor] = useState(settings.primaryColor ?? primaryColorConfig[0].main) + + // Hooks + useDebounce(() => handleChange('primaryColor', debouncedColor), 200, [debouncedColor]) + + return ( + <> + + + + ) +} + +const Customizer = ({ breakpoint = 'lg', dir = 'ltr', disableDirection = false }: CustomizerProps) => { + // States + const [isOpen, setIsOpen] = useState(false) + const [direction, setDirection] = useState(dir) + const [isMenuOpen, setIsMenuOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + + // Hooks + const theme = useTheme() + const pathName = usePathname() + const { settings, updateSettings, resetSettings, isSettingsChanged } = useSettings() + const isSystemDark = useMedia('(prefers-color-scheme: dark)', false) + + // Vars + let breakpointValue: CustomizerProps['breakpoint'] + + switch (breakpoint) { + case 'xxl': + breakpointValue = '1920px' + break + case 'xl': + breakpointValue = `${theme.breakpoints.values.xl}px` + break + case 'lg': + breakpointValue = `${theme.breakpoints.values.lg}px` + break + case 'md': + breakpointValue = `${theme.breakpoints.values.md}px` + break + case 'sm': + breakpointValue = `${theme.breakpoints.values.sm}px` + break + case 'xs': + breakpointValue = `${theme.breakpoints.values.xs}px` + break + default: + breakpointValue = breakpoint + } + + const breakpointReached = useMedia(`(max-width: ${breakpointValue})`, false) + const isMobileScreen = useMedia('(max-width: 600px)', false) + const isBelowLgScreen = useMedia('(max-width: 1200px)', false) + const isColorFromPrimaryConfig = primaryColorConfig.find(item => item.main === settings.primaryColor) + + const ScrollWrapper = isBelowLgScreen ? 'div' : PerfectScrollbar + + const handleToggle = () => { + setIsOpen(!isOpen) + } + + // Update Settings + const handleChange = (field: keyof Settings | 'direction', value: Settings[keyof Settings] | Direction) => { + // Update direction state + if (field === 'direction') { + setDirection(value as Direction) + } else { + // Update settings in cookie + updateSettings({ [field]: value }) + } + } + + const handleMenuClose = (event: MouseEvent | TouchEvent): void => { + if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) { + return + } + + setIsMenuOpen(false) + } + + return ( + !breakpointReached && ( +
+
+ +
+
+
+

Theme Customizer

+

Customize & Preview in Real Time

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+

Primary Color

+
+ {primaryColorConfig.map(item => ( +
handleChange('primaryColor', item.main)} + > +
+
+ ))} +
setIsMenuOpen(prev => !prev)} + > +
+ +
+
+ + {({ TransitionProps }) => ( + + + +
+ +
+
+
+
+ )} +
+
+
+
+

Mode

+
+
+
handleChange('mode', 'light')} + > + +
+

handleChange('mode', 'light')}> + Light +

+
+
+
handleChange('mode', 'dark')} + > + +
+

handleChange('mode', 'dark')}> + Dark +

+
+
+
handleChange('mode', 'system')} + > + +
+

handleChange('mode', 'system')}> + System +

+
+
+
+
+

Skin

+
+
+
handleChange('skin', 'default')} + > + +
+

handleChange('skin', 'default')}> + Default +

+
+
+
handleChange('skin', 'bordered')} + > + +
+

handleChange('skin', 'bordered')}> + Bordered +

+
+
+
+ {settings.mode === 'dark' || + (settings.mode === 'system' && isSystemDark) || + settings.layout === 'horizontal' ? null : ( +
+ + handleChange('semiDark', !settings.semiDark)} + /> +
+ )} +
+
+
+ +
+

Layouts

+
+
+
handleChange('layout', 'vertical')} + > + +
+

handleChange('layout', 'vertical')}> + Vertical +

+
+
+
handleChange('layout', 'collapsed')} + > + +
+

handleChange('layout', 'collapsed')}> + Collapsed +

+
+
+
handleChange('layout', 'horizontal')} + > + +
+

handleChange('layout', 'horizontal')}> + Horizontal +

+
+
+
+
+

Content

+
+
+
+ updateSettings({ + navbarContentWidth: 'compact', + contentWidth: 'compact', + footerContentWidth: 'compact' + }) + } + > + +
+

+ updateSettings({ + navbarContentWidth: 'compact', + contentWidth: 'compact', + footerContentWidth: 'compact' + }) + } + > + Compact +

+
+
+
+ updateSettings({ navbarContentWidth: 'wide', contentWidth: 'wide', footerContentWidth: 'wide' }) + } + > + +
+

+ updateSettings({ navbarContentWidth: 'wide', contentWidth: 'wide', footerContentWidth: 'wide' }) + } + > + Wide +

+
+
+
+ {!disableDirection && ( +
+

Direction

+
+ +
+
+ +
+

+ Left to Right
+ (English) +

+
+ + +
+
+ +
+

+ Right to Left
+ (Arabic) +

+
+ +
+
+ )} +
+
+ +
+ ) + ) +} + +export default Customizer diff --git a/src/@core/components/customizer/styles.module.css b/src/@core/components/customizer/styles.module.css new file mode 100644 index 0000000..cd5fafe --- /dev/null +++ b/src/@core/components/customizer/styles.module.css @@ -0,0 +1,174 @@ +.customizer { + block-size: 100%; + inline-size: 400px; + display: flex; + flex-direction: column; + background-color: var(--mui-palette-background-paper); + position: fixed; + inset-block-start: 0; + inset-inline-end: -400px; + box-shadow: none; + z-index: var(--customizer-z-index); + transition-property: inset-inline-end, box-shadow; + transition-duration: 300ms; + transition-timing-function: ease-in-out; + + &.show { + inset-inline-end: 0 !important; + box-shadow: var(--mui-customShadows-xl); + } + + &.smallScreen { + inline-size: 375px; + inset-inline-end: -375px; + + &.show .toggler { + display: none; + } + + .header, + .customizerBody { + padding-inline: 10px; + } + } +} + +.toggler { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + position: absolute; + inset-block-start: 20%; + inset-inline-end: 100%; + transform: translateY(-20%); + padding: 8px; + background-color: var(--primary-color); + color: var(--mui-palette-primary-contrastText); + border-start-start-radius: var(--border-radius); + border-end-start-radius: var(--border-radius); +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + padding-block: 16px; + padding-inline: 24px; + border-block-end: 1px solid var(--border-color); +} + +.customizerTitle { + font-size: 15px; + font-weight: 500; +} + +.customizerSubtitle { + font-size: 13px; + line-height: 1.538462; + color: var(--mui-palette-text-secondary); +} + +.dotStyles { + position: absolute; + inset-block-start: 0; + inset-inline-end: -5px; + block-size: 8px; + inline-size: 8px; + border-radius: 50%; + background-color: var(--mui-palette-error-main); + transform: scale(0); + transition-property: transform; + transition-duration: 300ms; + transition-timing-function: ease-in-out; + + &.show { + transform: scale(1); + } +} + +.customizerBody { + display: flex; + flex-direction: column; + padding: 24px; + gap: 32px; +} + +.itemWrapper { + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + outline: 1px solid transparent; + min-inline-size: 106px; + min-block-size: 68px; + cursor: pointer; + + &.active { + border-color: var(--primary-color); + outline: 1px solid var(--primary-color); + } +} + +.itemLabel { + font-size: 13px; + line-height: 1.538462; + cursor: pointer; + color: var(--mui-palette-text-secondary); +} + +.primaryColorWrapper { + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + outline: 1px solid transparent; + block-size: 50px; + inline-size: 50px; + padding: 8px; + cursor: pointer; + + &.active { + border-color: var(--primary-color); + outline: 1px solid var(--primary-color); + } +} + +.primaryColor { + block-size: 100%; + inline-size: 100%; + border-radius: var(--border-radius); +} + +.modeWrapper { + min-block-size: 54px; + + &.active { + color: var(--primary-color); + background-color: var(--mui-palette-primary-lighterOpacity); + } +} + +.hr { + border: 0; + border-block-start: 1px solid var(--border-color); +} + +.colorPopup { + padding: 16px; + margin-block-start: 1px; + + & .colorInput { + inline-size: 100%; + margin-block-start: 16px; + border-radius: var(--mui-shape-borderRadius); + padding-block: 8px; + padding-inline: 10px; + border: 1px solid var(--mui-palette-divider); + font-size: 14px; + } +} diff --git a/src/@core/components/mui/Autocomplete.tsx b/src/@core/components/mui/Autocomplete.tsx new file mode 100644 index 0000000..7076a54 --- /dev/null +++ b/src/@core/components/mui/Autocomplete.tsx @@ -0,0 +1,34 @@ +// React imports +import { forwardRef } from 'react' +import type { ElementType } from 'react' + +// MUI imports +import Paper from '@mui/material/Paper' +import Autocomplete from '@mui/material/Autocomplete' +import type { AutocompleteProps } from '@mui/material/Autocomplete' + +const CustomAutocomplete = forwardRef( + < + T, + Multiple extends boolean | undefined, + DisableClearable extends boolean | undefined, + FreeSolo extends boolean | undefined, + ChipComponent extends ElementType + >( + props: AutocompleteProps, + ref: any + ) => { + return ( + // eslint-disable-next-line lines-around-comment + + }} + /> + ) + } +) as typeof Autocomplete + +export default CustomAutocomplete diff --git a/src/@core/components/mui/Avatar.tsx b/src/@core/components/mui/Avatar.tsx new file mode 100644 index 0000000..92512c5 --- /dev/null +++ b/src/@core/components/mui/Avatar.tsx @@ -0,0 +1,51 @@ +'use client' + +// React Imports +import { forwardRef } from 'react' + +// MUI Imports +import MuiAvatar from '@mui/material/Avatar' +import { lighten, styled } from '@mui/material/styles' +import type { AvatarProps } from '@mui/material/Avatar' + +// Type Imports +import type { ThemeColor } from '@core/types' + +export type CustomAvatarProps = AvatarProps & { + color?: ThemeColor + skin?: 'filled' | 'light' | 'light-static' + size?: number +} + +const Avatar = styled(MuiAvatar)(({ skin, color, size, theme }) => { + return { + ...(color && + skin === 'light' && { + backgroundColor: `var(--mui-palette-${color}-lightOpacity)`, + color: `var(--mui-palette-${color}-main)` + }), + ...(color && + skin === 'light-static' && { + backgroundColor: lighten(theme.palette[color as ThemeColor].main, 0.84), + color: `var(--mui-palette-${color}-main)` + }), + ...(color && + skin === 'filled' && { + backgroundColor: `var(--mui-palette-${color}-main)`, + color: `var(--mui-palette-${color}-contrastText)` + }), + ...(size && { + height: size, + width: size + }) + } +}) + +const CustomAvatar = forwardRef((props: CustomAvatarProps, ref) => { + // Props + const { color, skin = 'filled', ...rest } = props + + return +}) + +export default CustomAvatar diff --git a/src/@core/components/mui/Badge.tsx b/src/@core/components/mui/Badge.tsx new file mode 100644 index 0000000..dde84f0 --- /dev/null +++ b/src/@core/components/mui/Badge.tsx @@ -0,0 +1,25 @@ +'use client' + +// MUI Imports +import MuiBadge from '@mui/material/Badge' +import type { BadgeProps } from '@mui/material/Badge' +import { styled } from '@mui/material/styles' + +export type CustomBadgeProps = BadgeProps & { + tonal?: 'true' | 'false' +} + +const Badge = styled(MuiBadge)(({ tonal, color }) => { + return { + ...(tonal === 'true' && { + '& .MuiBadge-badge.MuiBadge-standard': { + color: `var(--mui-palette-${color}-main)`, + backgroundColor: `var(--mui-palette-${color}-lightOpacity)` + } + }) + } +}) + +const CustomBadge = (props: CustomBadgeProps) => + +export default CustomBadge diff --git a/src/@core/components/mui/Chip.tsx b/src/@core/components/mui/Chip.tsx new file mode 100644 index 0000000..79fdca8 --- /dev/null +++ b/src/@core/components/mui/Chip.tsx @@ -0,0 +1,25 @@ +'use client' + +// React Imports +import React from 'react' + +// Mui Imports +import MuiChip from '@mui/material/Chip' +import { styled } from '@mui/material' +import type { ChipProps } from '@mui/material/Chip' + +export type CustomChipProps = ChipProps & { + round?: 'true' | 'false' +} + +const Chip = styled(MuiChip)(({ round }) => { + return { + ...(round === 'true' && { + borderRadius: 500 + }) + } +}) + +const CustomChip = (props: CustomChipProps) => + +export default CustomChip diff --git a/src/@core/components/mui/IconButton.tsx b/src/@core/components/mui/IconButton.tsx new file mode 100644 index 0000000..96b8b16 --- /dev/null +++ b/src/@core/components/mui/IconButton.tsx @@ -0,0 +1,79 @@ +'use client' + +import MuiButton from '@mui/material/Button' +import { styled } from '@mui/material/styles' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +const CustomIconButton = styled(MuiButton)(({ color, size, theme, variant }) => { + return { + minInlineSize: 0, + transition: 'none', + ...(size === 'small' + ? { + fontSize: '20px', + padding: theme.spacing(variant === 'outlined' ? 1 : 1.25), + '& i, & svg': { + fontSize: 'inherit' + } + } + : { + ...(size === 'large' + ? { + fontSize: '24px', + padding: theme.spacing(variant === 'outlined' ? 2.75 : 3), + '& i, & svg': { + fontSize: 'inherit' + } + } + : { + fontSize: '22px', + padding: theme.spacing(variant === 'outlined' ? 1.75 : 2), + '& i, & svg': { + fontSize: 'inherit' + } + }) + }), + ...(!color && { + color: 'var(--mui-palette-action-active)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'rgb(var(--mui-palette-text-primaryChannel) / 0.08)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'rgb(var(--mui-palette-text-primaryChannel) / 0.08)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-action-active)' + }, + ...(variant === 'outlined' && { + border: 'none !important', + ...(size === 'small' + ? { + padding: theme.spacing(1.25) + } + : { + ...(size === 'large' + ? { + padding: theme.spacing(3) + } + : { + padding: theme.spacing(2) + }) + }) + }), + ...(variant === 'contained' && { + boxShadow: 'none !important', + backgroundColor: 'transparent' + }), + ...(variant === 'tonal' && { + backgroundColor: 'transparent' + }) + }) + } +}) as typeof MuiButton + +export default CustomIconButton diff --git a/src/@core/components/mui/TabList.tsx b/src/@core/components/mui/TabList.tsx new file mode 100644 index 0000000..ce48fcf --- /dev/null +++ b/src/@core/components/mui/TabList.tsx @@ -0,0 +1,69 @@ +// MUI Imports +import MuiTabList from '@mui/lab/TabList' +import { styled } from '@mui/material/styles' +import type { TabListProps } from '@mui/lab/TabList' + +// Type Imports +import type { ThemeColor } from '@core/types' + +export type CustomTabListProps = TabListProps & { + color?: ThemeColor + pill?: 'true' | 'false' +} + +const TabList = styled(MuiTabList)(({ color, theme, pill, orientation }) => ({ + ...(pill === 'true' && { + minHeight: 38, + ...(orientation === 'vertical' + ? { + borderInlineEnd: 0 + } + : { + borderBlockEnd: 0 + }), + '&, & .MuiTabs-scroller': { + ...(orientation === 'vertical' && { + boxSizing: 'content-box' + }), + margin: `${theme.spacing(-1, -1, -1.5, -1)} !important`, + padding: theme.spacing(1, 1, 1.5, 1) + }, + '& .MuiTabs-indicator': { + display: 'none' + }, + '& .MuiTabs-flexContainer': { + gap: theme.spacing(1) + }, + '& .Mui-selected': { + backgroundColor: `var(--mui-palette-${color}-main) !important`, + color: `var(--mui-palette-${color}-contrastText) !important`, + boxShadow: `var(--mui-customShadows-${color}-sm)` + }, + '& .MuiTab-root': { + minHeight: 38, + padding: theme.spacing(2, 5), + borderRadius: 'var(--mui-shape-borderRadius)', + '&:hover': { + border: 0, + backgroundColor: `var(--mui-palette-${color}-lightOpacity)`, + color: `var(--mui-palette-${color}-main)`, + ...(orientation === 'vertical' + ? { + paddingInlineEnd: theme.spacing(5) + } + : { + paddingBlockEnd: theme.spacing(2) + }) + } + } + }) +})) + +const CustomTabList = (props: CustomTabListProps) => { + // Props + const { color = 'primary', ...rest } = props + + return +} + +export default CustomTabList diff --git a/src/@core/components/mui/TextField.tsx b/src/@core/components/mui/TextField.tsx new file mode 100644 index 0000000..0f2e01a --- /dev/null +++ b/src/@core/components/mui/TextField.tsx @@ -0,0 +1,270 @@ +'use client' + +// React Imports +import { forwardRef } from 'react' + +// MUI Imports +import { styled } from '@mui/material/styles' +import TextField from '@mui/material/TextField' +import type { TextFieldProps } from '@mui/material/TextField' +import type { InputLabelProps } from '@mui/material/InputLabel' + +const TextFieldStyled = styled(TextField)(({ theme }) => ({ + '& .MuiInputLabel-root': { + transform: 'none', + width: 'fit-content', + maxWidth: '100%', + lineHeight: 1.153, + position: 'relative', + fontSize: theme.typography.body2.fontSize, + marginBottom: theme.spacing(1), + color: 'var(--mui-palette-text-primary)', + '&:not(.Mui-error).MuiFormLabel-colorPrimary.Mui-focused': { + color: 'var(--mui-palette-primary-main) !important' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-text-disabled)' + }, + '&.Mui-error': { + color: 'var(--mui-palette-error-main)' + } + }, + '& .MuiInputBase-root': { + backgroundColor: 'transparent !important', + border: `1px solid var(--mui-palette-customColors-inputBorder)`, + '&:not(.Mui-focused):not(.Mui-disabled):not(.Mui-error):hover': { + borderColor: 'var(--mui-palette-action-active)' + }, + '&:before, &:after': { + display: 'none' + }, + '&.MuiInputBase-sizeSmall': { + borderRadius: 'var(--mui-shape-borderRadius)' + }, + '&.Mui-error': { + borderColor: 'var(--mui-palette-error-main)' + }, + '&.Mui-focused': { + borderWidth: 2, + '& .MuiInputBase-input:not(.MuiInputBase-readOnly):not([readonly])::placeholder': { + transform: 'translateX(4px)' + }, + '& :not(textarea).MuiFilledInput-input': { + padding: '6.25px 13px' + }, + '&:not(.Mui-error).MuiInputBase-colorPrimary': { + borderColor: 'var(--mui-palette-primary-main)', + boxShadow: 'var(--mui-customShadows-primary-sm)' + }, + '&.MuiInputBase-colorSecondary': { + borderColor: 'var(--mui-palette-secondary-main)' + }, + '&.MuiInputBase-colorInfo': { + borderColor: 'var(--mui-palette-info-main)' + }, + '&.MuiInputBase-colorSuccess': { + borderColor: 'var(--mui-palette-success-main)' + }, + '&.MuiInputBase-colorWarning': { + borderColor: 'var(--mui-palette-warning-main)' + }, + '&.MuiInputBase-colorError': { + borderColor: 'var(--mui-palette-error-main)' + }, + '&.Mui-error': { + borderColor: 'var(--mui-palette-error-main)' + } + }, + '&.Mui-disabled': { + backgroundColor: 'var(--mui-palette-action-hover) !important' + } + }, + + // Adornments + '& .MuiInputAdornment-root': { + marginBlockStart: '0px !important', + '&.MuiInputAdornment-positionStart + .MuiInputBase-input:not(textarea)': { + paddingInlineStart: '0px !important' + } + }, + '& .MuiInputBase-inputAdornedEnd.MuiInputBase-input': { + paddingInlineEnd: '0px !important' + }, + + '& .MuiInputBase-sizeSmall.MuiInputBase-adornedStart.Mui-focused': { + paddingInlineStart: '13px', + '& .MuiInputBase-input': { + paddingInlineStart: '0px !important' + } + }, + '& .MuiInputBase-sizeSmall.MuiInputBase-adornedStart:not(.MuiAutocomplete-inputRoot)': { + paddingInlineStart: '14px' + }, + '& .MuiInputBase-sizeSmall.MuiInputBase-adornedEnd:not(.MuiAutocomplete-inputRoot)': { + paddingInlineEnd: '14px' + }, + '& .MuiInputBase-sizeSmall.MuiInputBase-adornedEnd.Mui-focused:not(.MuiAutocomplete-inputRoot)': { + paddingInlineEnd: '13px', + '& .MuiInputBase-input': { + paddingInlineEnd: '0px !important' + } + }, + '& :not(.MuiInputBase-sizeSmall).MuiInputBase-adornedStart.Mui-focused': { + paddingInlineStart: '15px', + '& .MuiInputBase-input': { + paddingInlineStart: '0px !important' + } + }, + '& :not(.MuiInputBase-sizeSmall).MuiInputBase-adornedStart': { + paddingInlineStart: '16px' + }, + '& :not(.MuiInputBase-sizeSmall).MuiInputBase-adornedEnd.Mui-focused': { + paddingInlineEnd: '15px', + '& .MuiInputBase-input': { + paddingInlineEnd: '0px !important' + } + }, + '& :not(.MuiInputBase-sizeSmall).MuiInputBase-adornedEnd': { + paddingInlineEnd: '16px' + }, + '& .MuiInputAdornment-sizeMedium': { + 'i, svg': { + fontSize: '1.25rem' + } + }, + + '& .MuiInputBase-input': { + '&:not(textarea).MuiInputBase-inputSizeSmall': { + padding: '7.25px 14px' + }, + '&:not(.MuiInputBase-readOnly):not([readonly])::placeholder': { + transition: theme.transitions.create(['opacity', 'transform'], { + duration: theme.transitions.duration.shorter + }) + } + }, + '& :not(.MuiInputBase-sizeSmall).MuiInputBase-root': { + borderRadius: '8px', + fontSize: '17px', + lineHeight: '1.41', + '& .MuiInputBase-input': { + padding: '10.8px 16px' + }, + '&.Mui-focused': { + '& .MuiInputBase-input': { + padding: '9.8px 15px' + } + } + }, + '& .MuiFormHelperText-root': { + lineHeight: 1.154, + margin: theme.spacing(1, 0, 0), + fontSize: theme.typography.body2.fontSize, + '&.Mui-error': { + color: 'var(--mui-palette-error-main)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-text-disabled)' + } + }, + + // For Select + '& .MuiSelect-select.MuiInputBase-inputSizeSmall, & .MuiNativeSelect-select.MuiInputBase-inputSizeSmall': { + '& ~ i, & ~ svg': { + inlineSize: '1.125rem', + blockSize: '1.125rem' + } + }, + '& .MuiSelect-select': { + // lineHeight: 1.5, + minHeight: 'unset !important', + lineHeight: '1.4375em', + '&.MuiInputBase-input': { + paddingInlineEnd: '32px !important' + } + }, + '& .Mui-focused .MuiSelect-select': { + '& ~ i, & ~ svg': { + right: '0.9375rem' + } + }, + + '& .MuiSelect-select:focus, & .MuiNativeSelect-select:focus': { + backgroundColor: 'transparent' + }, + + // For Autocomplete + '& :not(.MuiInputBase-sizeSmall).MuiAutocomplete-inputRoot': { + paddingBlock: '5.55px', + '& .MuiAutocomplete-input': { + paddingInline: '8px !important', + paddingBlock: '5.25px !important' + }, + '&.Mui-focused .MuiAutocomplete-input': { + paddingInlineStart: '7px !important' + }, + '&.Mui-focused': { + paddingBlock: '4.55px !important' + }, + '& .MuiAutocomplete-endAdornment': { + top: 'calc(50% - 12px)' + } + }, + '& .MuiAutocomplete-inputRoot.MuiInputBase-sizeSmall': { + paddingBlock: '4.75px !important', + paddingInlineStart: '10px', + '&.Mui-focused': { + paddingBlock: '3.75px !important', + paddingInlineStart: '9px', + '.MuiAutocomplete-input': { + paddingBlock: '2.5px', + paddingInline: '3px !important' + } + }, + '& .MuiAutocomplete-input': { + paddingInline: '3px !important' + } + }, + '& .MuiAutocomplete-inputRoot': { + display: 'flex', + gap: '0.25rem', + '& .MuiAutocomplete-tag': { + margin: 0 + } + }, + '& .MuiAutocomplete-inputRoot.Mui-focused .MuiAutocomplete-endAdornment': { + right: '.9375rem' + }, + + // For Textarea + '& .MuiInputBase-multiline': { + '&.MuiInputBase-sizeSmall': { + padding: '6px 14px', + '&.Mui-focused': { + padding: '5px 13px' + } + }, + '& textarea.MuiInputBase-inputSizeSmall:placeholder-shown': { + overflowX: 'hidden' + } + } +})) + +const CustomTextField = forwardRef((props: TextFieldProps, ref) => { + const { size = 'small', slotProps, ...rest } = props + + return ( + + ) +}) + +export default CustomTextField diff --git a/src/@core/components/option-menu/index.tsx b/src/@core/components/option-menu/index.tsx new file mode 100644 index 0000000..c1ecfc9 --- /dev/null +++ b/src/@core/components/option-menu/index.tsx @@ -0,0 +1,141 @@ +'use client' + +// React Imports +import { useRef, useState } from 'react' +import type { ReactElement, ReactNode, SyntheticEvent } from 'react' + +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Tooltip from '@mui/material/Tooltip' +import Box from '@mui/material/Box' +import Popper from '@mui/material/Popper' +import MenuItem from '@mui/material/MenuItem' +import MenuList from '@mui/material/MenuList' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import IconButton from '@mui/material/IconButton' +import Divider from '@mui/material/Divider' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { OptionsMenuType, OptionType, OptionMenuItemType } from './types' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +const IconButtonWrapper = (props: Pick & { children: ReactElement }) => { + // Props + const { tooltipProps, children } = props + + return tooltipProps?.title ? {children} : children +} + +const MenuItemWrapper = ({ children, option }: { children: ReactNode; option: OptionMenuItemType }) => { + if (option.href) { + return ( + + {children} + + ) + } else { + return <>{children} + } +} + +const OptionMenu = (props: OptionsMenuType) => { + // Props + const { tooltipProps, icon, iconClassName, options, leftAlignMenu, iconButtonProps } = props + + // States + const [open, setOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + + // Hooks + const { settings } = useSettings() + + const handleToggle = () => { + setOpen(prevOpen => !prevOpen) + } + + const handleClose = (event: Event | SyntheticEvent) => { + if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) { + return + } + + setOpen(false) + } + + return ( + <> + + + {typeof icon === 'string' ? ( + + ) : (icon as ReactNode) ? ( + icon + ) : ( + + )} + + + + {({ TransitionProps }) => ( + + + + + {options.map((option: OptionType, index: number) => { + if (typeof option === 'string') { + return ( + + {option} + + ) + } else if ('divider' in option) { + return option.divider && + } else { + return ( + { + handleClose(e) + option.menuItemProps && option.menuItemProps.onClick + ? option.menuItemProps.onClick(e) + : null + }} + > + + {(typeof option.icon === 'string' ? : option.icon) || null} + {option.text} + + + ) + } + })} + + + + + )} + + + ) +} + +export default OptionMenu diff --git a/src/@core/components/option-menu/types.ts b/src/@core/components/option-menu/types.ts new file mode 100644 index 0000000..689e295 --- /dev/null +++ b/src/@core/components/option-menu/types.ts @@ -0,0 +1,42 @@ +// React Imports +import type { ReactNode } from 'react' + +// Next Imports +import type { LinkProps } from 'next/link' + +// MUI Imports +import type { IconButtonProps } from '@mui/material/IconButton' +import type { MenuItemProps } from '@mui/material/MenuItem' +import type { DividerProps } from '@mui/material/Divider' +import type { BoxProps } from '@mui/material/Box' +import type { TooltipProps } from '@mui/material/Tooltip' + +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?: BoxProps<'a'> + href?: LinkProps['href'] + menuItemProps?: MenuItemProps + divider?: never + dividerProps?: never +} + +export type OptionType = string | OptionDividerType | OptionMenuItemType + +export type OptionsMenuType = { + tooltipProps?: Omit + icon?: ReactNode + iconClassName?: string + options: OptionType[] + leftAlignMenu?: boolean + iconButtonProps?: IconButtonProps +} 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..0962e79 --- /dev/null +++ b/src/@core/components/scroll-to-top/index.tsx @@ -0,0 +1,51 @@ +'use client' + +// React Imports +import type { 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: 'var(--mui-zIndex-fab)', + position: 'fixed', + insetInlineEnd: theme.spacing(10), + insetBlockEnd: theme.spacing(14) +})) + +const ScrollToTop = (props: ScrollToTopProps) => { + // Props + const { children, className } = props + + // Hooks + // 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/contexts/settingsContext.tsx b/src/@core/contexts/settingsContext.tsx new file mode 100644 index 0000000..3f7ad89 --- /dev/null +++ b/src/@core/contexts/settingsContext.tsx @@ -0,0 +1,137 @@ +'use client' + +// React Imports +import type { ReactNode } from 'react' +import { createContext, useMemo, useState } from 'react' + +// Type Imports +import type { Mode, Skin, Layout, LayoutComponentWidth } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' +import primaryColorConfig from '@configs/primaryColorConfig' + +// Hook Imports +import { useObjectCookie } from '@core/hooks/useObjectCookie' + +// Settings type +export type Settings = { + mode?: Mode + skin?: Skin + semiDark?: boolean + layout?: Layout + navbarContentWidth?: LayoutComponentWidth + contentWidth?: LayoutComponentWidth + footerContentWidth?: LayoutComponentWidth + primaryColor?: string +} + +// UpdateSettingsOptions type +type UpdateSettingsOptions = { + updateCookie?: boolean +} + +// SettingsContextProps type +type SettingsContextProps = { + settings: Settings + updateSettings: (settings: Partial, options?: UpdateSettingsOptions) => void + isSettingsChanged: boolean + resetSettings: () => void + updatePageSettings: (settings: Partial) => () => void +} + +type Props = { + children: ReactNode + settingsCookie: Settings | null + mode?: Mode +} + +// Initial Settings Context +export const SettingsContext = createContext(null) + +// Settings Provider +export const SettingsProvider = (props: Props) => { + // Initial Settings + const initialSettings: Settings = { + mode: themeConfig.mode, + skin: themeConfig.skin, + semiDark: themeConfig.semiDark, + layout: themeConfig.layout, + navbarContentWidth: themeConfig.navbar.contentWidth, + contentWidth: themeConfig.contentWidth, + footerContentWidth: themeConfig.footer.contentWidth, + primaryColor: primaryColorConfig[0].main + } + + const updatedInitialSettings = { + ...initialSettings, + mode: props.mode || themeConfig.mode + } + + // Cookies + const [settingsCookie, updateSettingsCookie] = useObjectCookie( + themeConfig.settingsCookieName, + JSON.stringify(props.settingsCookie) !== '{}' ? props.settingsCookie : updatedInitialSettings + ) + + // State + const [_settingsState, _updateSettingsState] = useState( + JSON.stringify(settingsCookie) !== '{}' ? settingsCookie : updatedInitialSettings + ) + + const updateSettings = (settings: Partial, options?: UpdateSettingsOptions) => { + const { updateCookie = true } = options || {} + + _updateSettingsState(prev => { + const newSettings = { ...prev, ...settings } + + // Update cookie if needed + if (updateCookie) updateSettingsCookie(newSettings) + + return newSettings + }) + } + + /** + * Updates the settings for page with the provided settings object. + * Updated settings won't be saved to cookie hence will be reverted once navigating away from the page. + * + * @param settings - The partial settings object containing the properties to update. + * @returns A function to reset the page settings. + * + * @example + * useEffect(() => { + * return updatePageSettings({ theme: 'dark' }); + * }, []); + */ + const updatePageSettings = (settings: Partial): (() => void) => { + updateSettings(settings, { updateCookie: false }) + + // Returns a function to reset the page settings + return () => updateSettings(settingsCookie, { updateCookie: false }) + } + + const resetSettings = () => { + updateSettings(initialSettings) + } + + const isSettingsChanged = useMemo( + () => JSON.stringify(initialSettings) !== JSON.stringify(_settingsState), + // eslint-disable-next-line react-hooks/exhaustive-deps + [_settingsState] + ) + + return ( + + {props.children} + + ) +} diff --git a/src/@core/hooks/useImageVariant.ts b/src/@core/hooks/useImageVariant.ts new file mode 100644 index 0000000..0140ff9 --- /dev/null +++ b/src/@core/hooks/useImageVariant.ts @@ -0,0 +1,37 @@ +// React Imports +import { useMemo } from 'react' + +// Third-party imports +import { useColorScheme } from '@mui/material' + +// Type imports +import type { Mode } from '@core/types' + +// Hook Imports +import { useSettings } from './useSettings' + +export const useImageVariant = ( + mode: Mode, + imgLight: string, + imgDark: string, + imgLightBordered?: string, + imgDarkBordered?: string +): string => { + // Hooks + const { settings } = useSettings() + const { mode: muiMode, systemMode: muiSystemMode } = useColorScheme() + + return useMemo(() => { + const currentMode = muiMode === 'system' ? muiSystemMode : muiMode || mode + + const isBordered = settings?.skin === 'bordered' + const isDarkMode = currentMode === 'dark' + + if (isBordered && imgLightBordered && imgDarkBordered) { + return isDarkMode ? imgDarkBordered : imgLightBordered + } + + return isDarkMode ? imgDark : imgLight + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [mode, muiMode, muiSystemMode]) +} diff --git a/src/@core/hooks/useLayoutInit.ts b/src/@core/hooks/useLayoutInit.ts new file mode 100644 index 0000000..f0c2088 --- /dev/null +++ b/src/@core/hooks/useLayoutInit.ts @@ -0,0 +1,38 @@ +'use client' + +// React Imports +import { useEffect } from 'react' + +// Hook Imports +import { useCookie, useMedia } from 'react-use' + +// Type Imports +import { useColorScheme } from '@mui/material' + +import { useSettings } from '@core/hooks/useSettings' + +const useLayoutInit = (colorSchemeFallback: 'light' | 'dark') => { + // Hooks + const { settings } = useSettings() + const { setMode } = useColorScheme() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_, updateCookieColorPref] = useCookie('colorPref') + const isDark = useMedia('(prefers-color-scheme: dark)', colorSchemeFallback === 'dark') + + useEffect(() => { + const appMode = isDark ? 'dark' : 'light' + + updateCookieColorPref(appMode) + + if (settings.mode === 'system') { + // We need to change the mode in settings context to apply the mode change to MUI components + setMode(appMode) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isDark]) + + // This hook does not return anything as it is only used to initialize color preference cookie and settings context on first load +} + +export default useLayoutInit diff --git a/src/@core/hooks/useObjectCookie.ts b/src/@core/hooks/useObjectCookie.ts new file mode 100644 index 0000000..0c1f7d0 --- /dev/null +++ b/src/@core/hooks/useObjectCookie.ts @@ -0,0 +1,19 @@ +// React Imports +import { useMemo } from 'react' + +// Third-party Imports +import { useCookie } from 'react-use' + +export const useObjectCookie = (key: string, fallback?: T | null): [T, (newVal: T) => void] => { + // Hooks + const [valStr, updateCookie] = useCookie(key) + + // eslint-disable-next-line react-hooks/exhaustive-deps + const value = useMemo(() => (valStr ? JSON.parse(valStr) : fallback), [valStr]) + + const updateValue = (newVal: T) => { + updateCookie(JSON.stringify(newVal)) + } + + return [value, updateValue] +} diff --git a/src/@core/hooks/useSettings.tsx b/src/@core/hooks/useSettings.tsx new file mode 100644 index 0000000..0844fde --- /dev/null +++ b/src/@core/hooks/useSettings.tsx @@ -0,0 +1,16 @@ +// React Imports +import { useContext } from 'react' + +// Context Imports +import { SettingsContext } from '@core/contexts/settingsContext' + +export const useSettings = () => { + // Hooks + const context = useContext(SettingsContext) + + if (!context) { + throw new Error('useSettingsContext must be used within a SettingsProvider') + } + + return context +} diff --git a/src/@core/styles/horizontal/menuItemStyles.ts b/src/@core/styles/horizontal/menuItemStyles.ts new file mode 100644 index 0000000..f0db3d5 --- /dev/null +++ b/src/@core/styles/horizontal/menuItemStyles.ts @@ -0,0 +1,112 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { MenuItemStyles } from '@menu/types' + +// Util Imports +import { menuClasses } from '@menu/utils/menuClasses' + +const menuItemStyles = (theme: Theme, iconClass: string): MenuItemStyles => ({ + root: ({ level }) => ({ + ...(level === 0 && { + borderRadius: 6 + }), + [`&.${menuClasses.open} > .${menuClasses.button}`]: { + backgroundColor: 'var(--mui-palette-action-selected) !important' + }, + ...(level === 0 + ? { + [`& .${menuClasses.button}.${menuClasses.active}`]: { + color: 'var(--mui-palette-primary-contrastText) !important', + background: + theme.direction === 'ltr' + ? `linear-gradient(270deg, + rgb(var(--mui-palette-primary-mainChannel) / 0.7) 0%, + var(--mui-palette-primary-main) 100%) !important` + : `linear-gradient(270deg, + var(--mui-palette-primary-main) 100%, + rgb(var(--mui-palette-primary-mainChannel) / 0.7) 100%) !important` + } + } + : { + [`&:not([aria-expanded]) > .${menuClasses.button}.${menuClasses.active}`]: { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)' + }, + [`&[aria-expanded] > .${menuClasses.button}.${menuClasses.active}`]: { + backgroundColor: 'var(--mui-palette-action-selected) !important' + } + }), + [`&.${menuClasses.disabled} > .${menuClasses.button}`]: { + color: 'var(--mui-palette-text-disabled)', + '& *': { + color: 'inherit' + } + } + }), + button: { + borderRadius: 'var(--border-radius)', + paddingInline: theme.spacing(4), + '&:not(:has(.MuiChip-root))': { + paddingBlock: theme.spacing(2) + }, + '&:has(.MuiChip-root)': { + paddingBlock: theme.spacing(1.75) + }, + [`&:not(.${menuClasses.active}):hover, &:not(.${menuClasses.active}):focus-visible, &:not(.${menuClasses.active})[aria-expanded="true"]`]: + { + backgroundColor: 'var(--mui-palette-action-hover)' + } + }, + icon: ({ level }) => ({ + marginInlineEnd: theme.spacing(2), + ...(level < 2 ? { fontSize: '1.375rem' } : { fontSize: '0.75rem', color: 'var(--mui-palette-text-secondary)' }), + '& > i, & > svg': { + fontSize: 'inherit' + }, + [`& .${iconClass}`]: { + fontSize: '0.75rem', + color: 'var(--mui-palette-text-secondary)', + ...(level === 1 && { + marginInline: theme.spacing(1.25) + }), + [`.${menuClasses.active} &`]: { + color: 'var(--mui-palette-primary-main)' + } + } + }), + prefix: { + marginInlineEnd: theme.spacing(2) + }, + suffix: { + marginInlineStart: theme.spacing(2) + }, + subMenuStyles: { + zIndex: 'calc(var(--header-z-index) + 1)' + }, + subMenuExpandIcon: { + fontSize: '1.25rem', + marginInlineStart: theme.spacing(2), + '& i, & svg': { + fontSize: 'inherit' + } + }, + subMenuContent: { + borderRadius: 'var(--border-radius)', + backgroundColor: 'var(--mui-palette-background-paper)', + boxShadow: 'var(--mui-customShadows-lg)', + '[data-skin="bordered"] &': { + boxShadow: 'none', + border: '1px solid var(--mui-palette-divider)' + }, + '& > ul, & > div > ul': { + padding: theme.spacing(2), + '& > li:not(:last-child)': { + marginBlockEnd: theme.spacing(0.5) + } + } + } +}) + +export default menuItemStyles diff --git a/src/@core/styles/horizontal/menuRootStyles.ts b/src/@core/styles/horizontal/menuRootStyles.ts new file mode 100644 index 0000000..4b094da --- /dev/null +++ b/src/@core/styles/horizontal/menuRootStyles.ts @@ -0,0 +1,12 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const menuRootStyles = (theme: Theme) => { + return { + '& > ul > li:not(:last-of-type)': { + marginInlineEnd: theme.spacing(1.5) + } + } +} + +export default menuRootStyles diff --git a/src/@core/styles/stepper.ts b/src/@core/styles/stepper.ts new file mode 100644 index 0000000..4b9f6f6 --- /dev/null +++ b/src/@core/styles/stepper.ts @@ -0,0 +1,110 @@ +// MUI imports +import Box from '@mui/material/Box' +import { styled } from '@mui/material/styles' +import type { BoxProps } from '@mui/material/Box' + +const StepperWrapper = styled(Box)(({ theme }) => { + return { + [theme.breakpoints.down('md')]: { + '& .MuiStepper-horizontal:not(.MuiStepper-alternativeLabel)': { + flexDirection: 'column', + alignItems: 'flex-start' + } + }, + '& .MuiStep-root': { + '& .MuiStepLabel-iconContainer:empty': { + display: 'none' + }, + '& .step-label': { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + + '& .MuiAvatar-root': { + marginInlineEnd: theme.spacing(3) + } + }, + '& .step-number': { + ...theme.typography.h4, + marginRight: theme.spacing(2), + color: 'var(--mui-palette-text-primary) !important' + }, + '&:not(:has(.step-subtitle)) .step-number': { + ...theme.typography.h6 + }, + '& .step-title': { + ...theme.typography.body1, + fontWeight: 500, + color: 'var(--mui-palette-text-primary)' + }, + '& .step-subtitle': { + ...theme.typography.body2 + }, + '& .MuiStepLabel-root.Mui-disabled': { + '& .step-number': { + color: 'var(--mui-palette-text-disabled)' + } + }, + '& .Mui-error': { + '& .MuiStepLabel-labelContainer, & .step-number, & .step-title, & .step-subtitle': { + color: 'var(--mui-palette-error-main) !important' + } + } + }, + '& .MuiStepConnector-root': { + '& .MuiStepConnector-line': { + borderBlockStartWidth: 3, + borderRadius: 3 + }, + '&.Mui-active, &.Mui-completed': { + '& .MuiStepConnector-line': { + borderColor: 'var(--mui-palette-primary-main)' + } + }, + '&.Mui-disabled .MuiStepConnector-line': { + borderColor: 'var(--mui-palette-primary-lightOpacity)' + } + }, + '& .MuiStepper-alternativeLabel': { + '& .MuiStepConnector-root': { + top: 10 + }, + '& .MuiStepLabel-labelContainer': { + display: 'flex', + alignItems: 'center', + flexDirection: 'column', + '& > * + *': { + marginTop: theme.spacing(1) + } + } + }, + '& .MuiStepper-vertical': { + '& .MuiStep-root': { + '& .step-label': { + justifyContent: 'flex-start' + }, + '& .MuiStepContent-root': { + borderInlineStartWidth: 3, + marginLeft: theme.spacing(2.25), + borderColor: 'var(--mui-palette-primary-main)' + }, + '& .button-wrapper': { + marginTop: theme.spacing(4) + }, + '&.active + .MuiStepConnector-root .MuiStepConnector-line': { + borderColor: 'var(--mui-palette-primary-main)' + } + }, + '& .MuiStepConnector-root': { + marginLeft: theme.spacing(2.25), + '& .MuiStepConnector-line': { + borderBlockStartWidth: 0, + borderInlineStartWidth: 3, + borderRadius: 0 + } + } + } + } +}) as typeof Box + +export default StepperWrapper diff --git a/src/@core/styles/table.module.css b/src/@core/styles/table.module.css new file mode 100644 index 0000000..530a06b --- /dev/null +++ b/src/@core/styles/table.module.css @@ -0,0 +1,96 @@ +.table { + inline-size: 100%; + border-collapse: collapse; + font-size: 0.8125rem; + white-space: nowrap; + + [align='right'] > * { + text-align: end; + } + [align='center'] > * { + text-align: center; + } + + thead { + text-transform: uppercase; + color: var(--mui-palette-text-primary); + border-block-start: 1px solid var(--border-color); + + th { + font-weight: 500; + font-size: 0.8125rem; + letter-spacing: 0.2px; + line-height: 1.8462; + text-align: start; + block-size: 56px; + &:not(:first-of-type):not(:last-of-type) { + padding-block: 0.5rem; + padding-inline: 1rem; + } + &:first-of-type { + &:not(:has(input[type='checkbox'])) { + padding-block: 0.5rem; + padding-inline: 1.5rem 1rem; + } + &:has(input[type='checkbox']) { + padding-inline-start: 0.9375rem; + } + } + &:last-of-type { + padding-block: 0.5rem; + padding-inline: 1rem 1.5rem; + } + } + } + + tbody { + color: var(--mui-palette-text-secondary); + + th, + td { + font-size: 0.9375rem; + line-height: 1.4667; + block-size: 50px; + &:not(:first-of-type):not(:last-of-type) { + padding-block: 0.5rem; + padding-inline: 1rem; + } + &:first-of-type { + &:not(:has(input[type='checkbox'])) { + padding-block: 0.5rem; + padding-inline: 1.5rem 1rem; + } + &:has(input[type='checkbox']) { + inline-size: 51px; + padding-inline-start: 0.9375rem; + } + } + &:last-of-type { + padding-block: 0.5rem; + padding-inline: 1rem 1.5rem; + } + } + + tr:not(:last-child) { + border-block-end: 1px solid var(--border-color); + } + tr { + border-block-start: 1px solid var(--border-color); + } + } +} + +.cellWithInput input { + inline-size: 100%; + background-color: transparent; + font-size: inherit; + color: inherit; + border-radius: var(--mui-shape-customBorderRadius-sm); + padding-block: 6px; + padding-inline: 10px; + margin-inline: -10px; + + &:focus-visible { + outline: 1px solid var(--mui-palette-primary-main); + } +} diff --git a/src/@core/styles/vertical/menuItemStyles.ts b/src/@core/styles/vertical/menuItemStyles.ts new file mode 100644 index 0000000..53f4387 --- /dev/null +++ b/src/@core/styles/vertical/menuItemStyles.ts @@ -0,0 +1,167 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { MenuItemStyles } from '@menu/types' +import type { VerticalNavState } from '@menu/contexts/verticalNavContext' + +// Util Imports +import { menuClasses } from '@menu/utils/menuClasses' + +const menuItemStyles = (verticalNavOptions: VerticalNavState, theme: Theme): MenuItemStyles => { + // Vars + const { isCollapsed, isHovered, isPopoutWhenCollapsed, transitionDuration } = verticalNavOptions + + const popoutCollapsed = isPopoutWhenCollapsed && isCollapsed + const popoutExpanded = isPopoutWhenCollapsed && !isCollapsed + const collapsedNotHovered = isCollapsed && !isHovered + + return { + root: ({ level }) => ({ + ...(!isPopoutWhenCollapsed || popoutExpanded || (popoutCollapsed && level === 0) + ? { + marginBlockStart: theme.spacing(1.5) + } + : { + marginBlockStart: 0 + }), + [`&.${menuClasses.subMenuRoot}.${menuClasses.open} > .${menuClasses.button}, &.${menuClasses.subMenuRoot} > .${menuClasses.button}.${menuClasses.active}`]: + { + backgroundColor: 'var(--mui-palette-action-selected) !important' + }, + [`&.${menuClasses.disabled} > .${menuClasses.button}`]: { + color: 'var(--mui-palette-text-disabled)', + '& *': { + color: 'inherit' + } + }, + [`&:not(.${menuClasses.subMenuRoot}) > .${menuClasses.button}.${menuClasses.active}`]: { + ...(popoutCollapsed && level > 0 + ? { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + [`& .${menuClasses.icon}`]: { + color: 'var(--mui-palette-primary-main)' + } + } + : { + color: 'var(--mui-palette-primary-contrastText)', + background: + theme.direction === 'ltr' + ? `linear-gradient(270deg, + rgb(var(--mui-palette-primary-mainChannel) / 0.7) 0%, + var(--mui-palette-primary-main) 100%) !important` + : `linear-gradient(270deg, + var(--mui-palette-primary-main) 100%, + rgb(var(--mui-palette-primary-mainChannel) / 0.7) 100%) !important`, + boxShadow: 'var(--mui-customShadows-primary-sm)', + [`& .${menuClasses.icon}`]: { + color: 'inherit' + } + }) + } + }), + button: ({ level, active }) => ({ + paddingBlock: '8px', + paddingInline: '12px', + borderRadius: 'var(--border-radius)', + ...(!(isCollapsed && !isHovered) && { + '&:has(.MuiChip-root)': { + paddingBlock: theme.spacing(1.75) + } + }), + + ...((!isPopoutWhenCollapsed || popoutExpanded || (popoutCollapsed && level === 0)) && { + borderRadius: 'var(--mui-shape-borderRadius)', + transition: `padding-inline-start ${transitionDuration}ms ease-in-out` + }), + ...(!active && { + '&:hover, &:focus-visible': { + backgroundColor: 'var(--mui-palette-action-hover)' + }, + '&[aria-expanded="true"]': { + backgroundColor: 'var(--mui-palette-action-selected)' + } + }) + }), + icon: ({ level }) => ({ + transition: `margin-inline-end ${transitionDuration}ms ease-in-out`, + ...(level === 0 && { + fontSize: '1.375rem' + }), + ...(level > 0 && { + fontSize: '0.75rem', + color: 'var(--mui-palette-text-secondary)' + }), + ...(level === 0 && { + marginInlineEnd: theme.spacing(2) + }), + ...(level > 0 && { + marginInlineEnd: theme.spacing(3.5) + }), + ...(level === 1 && + !popoutCollapsed && { + marginInlineStart: theme.spacing(1.5) + }), + ...(level > 1 && { + marginInlineStart: theme.spacing((popoutCollapsed ? 0 : 1.5) + 2.5 * (level - 1)) + }), + ...(collapsedNotHovered && { + marginInlineEnd: 0 + }), + ...(popoutCollapsed && + level > 0 && { + marginInlineEnd: theme.spacing(2) + }), + '& > i, & > svg': { + fontSize: 'inherit' + } + }), + prefix: { + marginInlineEnd: theme.spacing(2) + }, + label: ({ level }) => ({ + ...((!isPopoutWhenCollapsed || popoutExpanded || (popoutCollapsed && level === 0)) && { + transition: `opacity ${transitionDuration}ms ease-in-out`, + ...(collapsedNotHovered && { + opacity: 0 + }) + }) + }), + suffix: { + marginInlineStart: theme.spacing(2) + }, + subMenuExpandIcon: { + fontSize: '1.25rem', + marginInlineStart: theme.spacing(2), + '& i, & svg': { + fontSize: 'inherit' + } + }, + subMenuContent: ({ level }) => ({ + zIndex: 'calc(var(--drawer-z-index) + 1)', + borderRadius: 'var(--border-radius)', + backgroundColor: popoutCollapsed ? 'var(--mui-palette-background-paper)' : 'transparent', + ...(popoutCollapsed && { + '& > ul, & > div > ul': { + [`& > li:not(:last-child), & > li > .${menuClasses.button}:not(:last-child)`]: { + marginBlockEnd: `${theme.spacing(0.5)} !important` + } + }, + ...(level === 0 && { + boxShadow: 'var(--mui-customShadows-sm)', + '[data-skin="bordered"] ~ [data-floating-ui-portal] &': { + boxShadow: 'none', + border: '1px solid var(--mui-palette-divider)' + }, + [`& .${menuClasses.button}`]: { + paddingInline: theme.spacing(4) + }, + padding: theme.spacing(2) + }) + }) + }) + } +} + +export default menuItemStyles diff --git a/src/@core/styles/vertical/menuSectionStyles.ts b/src/@core/styles/vertical/menuSectionStyles.ts new file mode 100644 index 0000000..290b551 --- /dev/null +++ b/src/@core/styles/vertical/menuSectionStyles.ts @@ -0,0 +1,53 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { VerticalNavState } from '@menu/contexts/verticalNavContext' +import type { MenuProps } from '@menu/vertical-menu' + +// Util Imports +import { menuClasses } from '@menu/utils/menuClasses' + +const menuSectionStyles = (verticalNavOptions: VerticalNavState, theme: Theme): MenuProps['menuSectionStyles'] => { + // Vars + const { isCollapsed, isHovered } = verticalNavOptions + + const collapsedNotHovered = isCollapsed && !isHovered + + return { + root: { + marginBlockStart: theme.spacing(0), + [`& .${menuClasses.menuSectionContent}`]: { + color: 'var(--mui-palette-text-disabled)', + paddingInline: '12px !important', + paddingBlock: `${theme.spacing(collapsedNotHovered ? 3.625 : 1.5)} !important`, + marginBlockStart: theme.spacing(3.5), + + '&:before': { + content: '""', + blockSize: 1, + inlineSize: '1.375rem', + backgroundColor: 'var(--mui-palette-text-disabled)' + }, + ...(!collapsedNotHovered && { + '&:before': { + content: 'none' + } + }), + + [`& .${menuClasses.menuSectionLabel}`]: { + flexGrow: 0, + textTransform: 'uppercase', + fontSize: '13px', + lineHeight: 1.38462, + letterSpacing: '0.4px', + ...(collapsedNotHovered && { + display: 'none' + }) + } + } + } + } +} + +export default menuSectionStyles diff --git a/src/@core/styles/vertical/navigationCustomStyles.ts b/src/@core/styles/vertical/navigationCustomStyles.ts new file mode 100644 index 0000000..87fd604 --- /dev/null +++ b/src/@core/styles/vertical/navigationCustomStyles.ts @@ -0,0 +1,59 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { VerticalNavState } from '@menu/contexts/verticalNavContext' + +// Util Imports +import { menuClasses, verticalNavClasses } from '@menu/utils/menuClasses' + +const navigationCustomStyles = (verticalNavOptions: VerticalNavState, theme: Theme) => { + // Vars + const { collapsedWidth, isCollapsed, isHovered, transitionDuration } = verticalNavOptions + + const collapsedHovered = isCollapsed && isHovered + const collapsedNotHovered = isCollapsed && !isHovered + + return { + color: 'var(--mui-palette-text-primary)', + zIndex: 'var(--drawer-z-index) !important', + [`& .${verticalNavClasses.header}`]: { + paddingBlock: theme.spacing(5), + paddingInline: theme.spacing(5.5, 4), + + ...(collapsedNotHovered && { + paddingInline: theme.spacing(((collapsedWidth as number) - 35) / 8), + '& a': { + transform: `translateX(-${22 - ((collapsedWidth as number) - 29) / 2}px)` + } + }), + '& a': { + transition: `transform ${transitionDuration}ms ease` + } + }, + [`& .${verticalNavClasses.container}`]: { + transition: theme.transitions.create(['inline-size', 'inset-inline-start', 'box-shadow'], { + duration: transitionDuration, + easing: 'ease-in-out' + }), + borderColor: 'transparent', + boxShadow: 'var(--mui-customShadows-sm)', + '[data-skin="bordered"] &': { + boxShadow: 'none', + ...(collapsedHovered && { + boxShadow: 'var(--mui-customShadows-sm)' + }), + borderColor: 'var(--mui-palette-divider)' + } + }, + [`& .${menuClasses.root}`]: { + paddingBlock: theme.spacing(1), + paddingInline: theme.spacing(3) + }, + [`& .${verticalNavClasses.backdrop}`]: { + backgroundColor: 'var(--backdrop-color)' + } + } +} + +export default navigationCustomStyles diff --git a/src/@core/svg/ContentCompact.tsx b/src/@core/svg/ContentCompact.tsx new file mode 100644 index 0000000..30f7b70 --- /dev/null +++ b/src/@core/svg/ContentCompact.tsx @@ -0,0 +1,20 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const ContentCompact = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + ) +} + +export default ContentCompact diff --git a/src/@core/svg/ContentWide.tsx b/src/@core/svg/ContentWide.tsx new file mode 100644 index 0000000..fad63bc --- /dev/null +++ b/src/@core/svg/ContentWide.tsx @@ -0,0 +1,20 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const ContentWide = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + ) +} + +export default ContentWide diff --git a/src/@core/svg/DirectionLtr.tsx b/src/@core/svg/DirectionLtr.tsx new file mode 100644 index 0000000..d1af1ef --- /dev/null +++ b/src/@core/svg/DirectionLtr.tsx @@ -0,0 +1,96 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const DirectionLtr = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + ) +} + +export default DirectionLtr diff --git a/src/@core/svg/DirectionRtl.tsx b/src/@core/svg/DirectionRtl.tsx new file mode 100644 index 0000000..b4fc541 --- /dev/null +++ b/src/@core/svg/DirectionRtl.tsx @@ -0,0 +1,96 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const DirectionRtl = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + ) +} + +export default DirectionRtl diff --git a/src/@core/svg/LayoutCollapsed.tsx b/src/@core/svg/LayoutCollapsed.tsx new file mode 100644 index 0000000..b704b70 --- /dev/null +++ b/src/@core/svg/LayoutCollapsed.tsx @@ -0,0 +1,62 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const LayoutCollapsed = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + + + ) +} + +export default LayoutCollapsed diff --git a/src/@core/svg/LayoutHorizontal.tsx b/src/@core/svg/LayoutHorizontal.tsx new file mode 100644 index 0000000..c91b560 --- /dev/null +++ b/src/@core/svg/LayoutHorizontal.tsx @@ -0,0 +1,45 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const LayoutHorizontal = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + ) +} + +export default LayoutHorizontal diff --git a/src/@core/svg/LayoutVertical.tsx b/src/@core/svg/LayoutVertical.tsx new file mode 100644 index 0000000..a482cf2 --- /dev/null +++ b/src/@core/svg/LayoutVertical.tsx @@ -0,0 +1,62 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const LayoutVertical = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + + + ) +} + +export default LayoutVertical diff --git a/src/@core/svg/Logo.tsx b/src/@core/svg/Logo.tsx new file mode 100644 index 0000000..7915a37 --- /dev/null +++ b/src/@core/svg/Logo.tsx @@ -0,0 +1,37 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Logo = (props: SVGAttributes) => { + return ( + + + + + + + ) +} + +export default Logo diff --git a/src/@core/svg/SkinBordered.tsx b/src/@core/svg/SkinBordered.tsx new file mode 100644 index 0000000..72bb506 --- /dev/null +++ b/src/@core/svg/SkinBordered.tsx @@ -0,0 +1,57 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const SkinDefault = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + + ) +} + +export default SkinDefault diff --git a/src/@core/svg/SkinDefault.tsx b/src/@core/svg/SkinDefault.tsx new file mode 100644 index 0000000..5026b7e --- /dev/null +++ b/src/@core/svg/SkinDefault.tsx @@ -0,0 +1,62 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const SkinDefault = (props: SVGAttributes) => { + return ( + + + + + + + + + + + + + + + + + + ) +} + +export default SkinDefault diff --git a/src/@core/tailwind/plugin.ts b/src/@core/tailwind/plugin.ts new file mode 100644 index 0000000..9e3c05a --- /dev/null +++ b/src/@core/tailwind/plugin.ts @@ -0,0 +1,91 @@ +import plugin from 'tailwindcss/plugin' + +export default plugin(function () {}, { + theme: { + borderColor: ({ theme }) => ({ + ...theme('colors'), + DEFAULT: 'var(--border-color, currentColor)' + }), + borderRadius: { + none: '0px', + xs: 'var(--mui-shape-customBorderRadius-xs)', + sm: 'var(--mui-shape-customBorderRadius-sm)', + DEFAULT: '0.375rem', + md: 'var(--mui-shape-customBorderRadius-md)', + lg: 'var(--mui-shape-customBorderRadius-lg)', + xl: 'var(--mui-shape-customBorderRadius-xl)', + '2xl': '0.75rem', + '3xl': '1rem', + '4xl': '1.5rem', + full: '9999px' + }, + screens: { + sm: '600px', + md: '900px', + lg: '1200px', + xl: '1536px', + '2xl': '1920px' + }, + extend: { + boxShadow: { + xs: 'var(--mui-customShadows-xs)', + sm: 'var(--mui-customShadows-sm)', + DEFAULT: 'var(--mui-customShadows-md)', + md: 'var(--mui-customShadows-md)', + lg: 'var(--mui-customShadows-lg)', + xl: 'var(--mui-customShadows-xl)', + primarySm: 'var(--mui-customShadows-primary-sm)', + primaryMd: 'var(--mui-customShadows-primary-md)', + primaryLg: 'var(--mui-customShadows-primary-lg)', + secondarySm: 'var(--mui-customShadows-secondary-sm)', + secondaryMd: 'var(--mui-customShadows-secondary-md)', + secondaryLg: 'var(--mui-customShadows-secondary-lg)', + errorSm: 'var(--mui-customShadows-error-sm)', + errorMd: 'var(--mui-customShadows-error-md)', + errorLg: 'var(--mui-customShadows-error-lg)', + warningSm: 'var(--mui-customShadows-warning-sm)', + warningMd: 'var(--mui-customShadows-warning-md)', + warningLg: 'var(--mui-customShadows-warning-lg)', + infoSm: 'var(--mui-customShadows-info-sm)', + infoMd: 'var(--mui-customShadows-info-md)', + infoLg: 'var(--mui-customShadows-info-lg)', + successSm: 'var(--mui-customShadows-success-sm)', + successMd: 'var(--mui-customShadows-success-md)', + successLg: 'var(--mui-customShadows-success-lg)' + }, + colors: { + primary: 'var(--primary-color)', + primaryLight: 'var(--mui-palette-primary-lightOpacity)', + primaryLighter: 'var(--mui-palette-primary-lighterOpacity)', + secondary: 'var(--mui-palette-secondary-main)', + error: 'var(--mui-palette-error-main)', + errorLight: 'var(--mui-palette-error-lightOpacity)', + errorLighter: 'var(--mui-palette-error-lighterOpacity)', + warning: 'var(--mui-palette-warning-main)', + info: 'var(--mui-palette-info-main)', + success: 'var(--mui-palette-success-main)', + textPrimary: 'var(--mui-palette-text-primary)', + textSecondary: 'var(--mui-palette-text-secondary)', + textDisabled: 'var(--mui-palette-text-disabled)', + actionActive: 'var(--mui-palette-action-active)', + actionHover: 'var(--mui-palette-action-hover)', + actionSelected: 'var(--mui-palette-action-selected)', + actionFocus: 'var(--mui-palette-action-focus)', + backgroundPaper: 'var(--mui-palette-background-paper)', + backgroundDefault: 'var(--mui-palette-background-default)', + backgroundChat: 'var(--mui-palette-customColors-chatBg)', + backdrop: 'var(--backdrop-color)', + facebook: '#4267B2', + twitter: '#1DA1F2', + linkedin: '#007BB6' + }, + zIndex: { + header: 'var(--header-z-index)', + footer: 'var(--footer-z-index)', + customizer: 'var(--customizer-z-index)', + search: 'var(--search-z-index)', + drawer: 'var(--drawer-z-index)' + } + } + } +}) diff --git a/src/@core/theme/colorSchemes.ts b/src/@core/theme/colorSchemes.ts new file mode 100644 index 0000000..14d3341 --- /dev/null +++ b/src/@core/theme/colorSchemes.ts @@ -0,0 +1,316 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const colorSchemes = (skin: Skin): Theme['colorSchemes'] => { + return { + light: { + palette: { + primary: { + main: '#7367F0', + light: '#8F85F3', + dark: '#675DD8', + lighterOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.38)' + }, + secondary: { + main: '#808390', + light: '#999CA6', + dark: '#737682', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.38)' + }, + error: { + main: '#FF4C51', + light: '#FF7074', + dark: '#E64449', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.38)' + }, + warning: { + main: '#FF9F43', + light: '#FFB269', + dark: '#E68F3C', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.38)' + }, + info: { + main: '#00BAD1', + light: '#33C8DA', + dark: '#00A7BC', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.38)' + }, + success: { + main: '#28C76F', + light: '#53D28C', + dark: '#24B364', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.38)' + }, + text: { + primary: `rgb(var(--mui-mainColorChannels-light) / 0.9)`, + secondary: `rgb(var(--mui-mainColorChannels-light) / 0.7)`, + disabled: `rgb(var(--mui-mainColorChannels-light) / 0.4)`, + primaryChannel: 'var(--mui-mainColorChannels-light)', + secondaryChannel: 'var(--mui-mainColorChannels-light)' + }, + divider: `rgb(var(--mui-mainColorChannels-light) / 0.12)`, + dividerChannel: 'var(--mui-mainColorChannels-light)', + background: { + default: skin === 'bordered' ? '#FFFFFF' : '#F8F7FA', + paper: '#FFFFFF', + paperChannel: '255 255 255' + }, + action: { + active: `rgb(var(--mui-mainColorChannels-light) / 0.6)`, + hover: `rgb(var(--mui-mainColorChannels-light) / 0.06)`, + selected: `rgb(var(--mui-mainColorChannels-light) / 0.08)`, + disabled: `rgb(var(--mui-mainColorChannels-light) / 0.3)`, + disabledBackground: `rgb(var(--mui-mainColorChannels-light) / 0.16)`, + focus: `rgb(var(--mui-mainColorChannels-light) / 0.1)`, + focusOpacity: 0.1, + activeChannel: 'var(--mui-mainColorChannels-light)', + selectedChannel: 'var(--mui-mainColorChannels-light)' + }, + Alert: { + errorColor: 'var(--mui-palette-error-main)', + warningColor: 'var(--mui-palette-warning-main)', + infoColor: 'var(--mui-palette-info-main)', + successColor: 'var(--mui-palette-success-main)', + errorStandardBg: 'var(--mui-palette-error-lightOpacity)', + warningStandardBg: 'var(--mui-palette-warning-lightOpacity)', + infoStandardBg: 'var(--mui-palette-info-lightOpacity)', + successStandardBg: 'var(--mui-palette-success-lightOpacity)', + errorFilledColor: 'var(--mui-palette-error-contrastText)', + warningFilledColor: 'var(--mui-palette-warning-contrastText)', + infoFilledColor: 'var(--mui-palette-info-contrastText)', + successFilledColor: 'var(--mui-palette-success-contrastText)', + errorFilledBg: 'var(--mui-palette-error-main)', + warningFilledBg: 'var(--mui-palette-warning-main)', + infoFilledBg: 'var(--mui-palette-info-main)', + successFilledBg: 'var(--mui-palette-success-main)' + }, + Avatar: { + defaultBg: '#EEEDF0' + }, + Chip: { + defaultBorder: 'var(--mui-palette-divider)' + }, + FilledInput: { + bg: 'var(--mui-palette-action-hover)', + hoverBg: 'var(--mui-palette-action-selected)', + disabledBg: 'var(--mui-palette-action-hover)' + }, + SnackbarContent: { + bg: '#2F2B3D', + color: 'var(--mui-palette-background-paper)' + }, + Switch: { + defaultColor: 'var(--mui-palette-common-white)', + defaultDisabledColor: 'var(--mui-palette-common-white)', + primaryDisabledColor: 'var(--mui-palette-common-white)', + secondaryDisabledColor: 'var(--mui-palette-common-white)', + errorDisabledColor: 'var(--mui-palette-common-white)', + warningDisabledColor: 'var(--mui-palette-common-white)', + infoDisabledColor: 'var(--mui-palette-common-white)', + successDisabledColor: 'var(--mui-palette-common-white)' + }, + Tooltip: { + bg: '#2F2B3D' + }, + TableCell: { + border: 'var(--mui-palette-divider)' + }, + customColors: { + bodyBg: '#F8F7FA', + chatBg: '#F3F2F5', + greyLightBg: '#FAFAFA', + inputBorder: `rgb(var(--mui-mainColorChannels-light) / 0.22)`, + tableHeaderBg: '#FFFFFF', + tooltipText: '#FFFFFF', + trackBg: '#F1F0F2' + } + } + }, + dark: { + palette: { + primary: { + main: '#7367F0', + light: '#8F85F3', + dark: '#675DD8', + lighterOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-primary-mainChannel) / 0.38)' + }, + secondary: { + main: '#808390', + light: '#999CA6', + dark: '#737682', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.38)' + }, + error: { + main: '#FF4C51', + light: '#FF7074', + dark: '#E64449', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-error-mainChannel) / 0.38)' + }, + warning: { + main: '#FF9F43', + light: '#FFB269', + dark: '#E68F3C', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-warning-mainChannel) / 0.38)' + }, + info: { + main: '#00BAD1', + light: '#33C8DA', + dark: '#00A7BC', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-info-mainChannel) / 0.38)' + }, + success: { + main: '#28C76F', + light: '#53D28C', + dark: '#24B364', + contrastText: '#FFF', + lighterOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.08)', + lightOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.16)', + mainOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.24)', + darkOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.32)', + darkerOpacity: 'rgb(var(--mui-palette-success-mainChannel) / 0.38)' + }, + text: { + primary: `rgb(var(--mui-mainColorChannels-dark) / 0.9)`, + secondary: `rgb(var(--mui-mainColorChannels-dark) / 0.7)`, + disabled: `rgb(var(--mui-mainColorChannels-dark) / 0.4)`, + primaryChannel: 'var(--mui-mainColorChannels-dark)', + secondaryChannel: 'var(--mui-mainColorChannels-dark)' + }, + divider: `rgb(var(--mui-mainColorChannels-dark) / 0.12)`, + dividerChannel: 'var(--mui-mainColorChannels-dark)', + background: { + default: skin === 'bordered' ? '#2F3349' : '#25293C', + paper: '#2F3349', + paperChannel: '47 51 73' + }, + action: { + active: `rgb(var(--mui-mainColorChannels-dark) / 0.6)`, + hover: `rgb(var(--mui-mainColorChannels-dark) / 0.06)`, + selected: `rgb(var(--mui-mainColorChannels-dark) / 0.08)`, + disabled: `rgb(var(--mui-mainColorChannels-dark) / 0.3)`, + disabledBackground: `rgb(var(--mui-mainColorChannels-dark) / 0.16)`, + focus: `rgb(var(--mui-mainColorChannels-dark) / 0.1)`, + focusOpacity: 0.1, + activeChannel: 'var(--mui-mainColorChannels-dark)', + selectedChannel: 'var(--mui-mainColorChannels-dark)' + }, + Alert: { + errorColor: 'var(--mui-palette-error-main)', + warningColor: 'var(--mui-palette-warning-main)', + infoColor: 'var(--mui-palette-info-main)', + successColor: 'var(--mui-palette-success-main)', + errorStandardBg: 'var(--mui-palette-error-lightOpacity)', + warningStandardBg: 'var(--mui-palette-warning-lightOpacity)', + infoStandardBg: 'var(--mui-palette-info-lightOpacity)', + successStandardBg: 'var(--mui-palette-success-lightOpacity)', + errorFilledColor: 'var(--mui-palette-error-contrastText)', + warningFilledColor: 'var(--mui-palette-warning-contrastText)', + infoFilledColor: 'var(--mui-palette-info-contrastText)', + successFilledColor: 'var(--mui-palette-success-contrastText)', + errorFilledBg: 'var(--mui-palette-error-main)', + warningFilledBg: 'var(--mui-palette-warning-main)', + infoFilledBg: 'var(--mui-palette-info-main)', + successFilledBg: 'var(--mui-palette-success-main)' + }, + Avatar: { + defaultBg: '#373B50' + }, + Chip: { + defaultBorder: 'var(--mui-palette-divider)' + }, + FilledInput: { + bg: 'var(--mui-palette-action-hover)', + hoverBg: 'var(--mui-palette-action-selected)', + disabledBg: `var(--mui-palette-action-hover)` + }, + SnackbarContent: { + bg: '#F7F4FF', + color: 'var(--mui-palette-background-paper)' + }, + Switch: { + defaultColor: 'var(--mui-palette-common-white)', + defaultDisabledColor: 'var(--mui-palette-common-white)', + primaryDisabledColor: 'var(--mui-palette-common-white)', + secondaryDisabledColor: 'var(--mui-palette-common-white)', + errorDisabledColor: 'var(--mui-palette-common-white)', + warningDisabledColor: 'var(--mui-palette-common-white)', + infoDisabledColor: 'var(--mui-palette-common-white)', + successDisabledColor: 'var(--mui-palette-common-white)' + }, + Tooltip: { + bg: '#F7F4FF' + }, + TableCell: { + border: 'var(--mui-palette-divider)' + }, + customColors: { + bodyBg: '#25293C', + chatBg: '#202534', + greyLightBg: '#353A52', + inputBorder: `rgb(var(--mui-mainColorChannels-dark) / 0.22)`, + tableHeaderBg: '#2F3349', + tooltipText: '#2F3349', + trackBg: '#3A3F57' + } + } + } + } as Theme['colorSchemes'] +} + +export default colorSchemes diff --git a/src/@core/theme/customShadows.ts b/src/@core/theme/customShadows.ts new file mode 100644 index 0000000..09e5f12 --- /dev/null +++ b/src/@core/theme/customShadows.ts @@ -0,0 +1,47 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { SystemMode } from '@core/types' + +const customShadows = (mode: SystemMode): Theme['customShadows'] => { + return { + xs: `0px 1px 6px rgb(var(--mui-mainColorChannels-${mode}Shadow) / ${mode === 'light' ? 0.1 : 0.16})`, + sm: `0px 2px 8px rgb(var(--mui-mainColorChannels-${mode}Shadow) / ${mode === 'light' ? 0.12 : 0.18})`, + md: `0px 3px 12px rgb(var(--mui-mainColorChannels-${mode}Shadow) / ${mode === 'light' ? 0.14 : 0.2})`, + lg: `0px 4px 18px rgb(var(--mui-mainColorChannels-${mode}Shadow) / ${mode === 'light' ? 0.16 : 0.22})`, + xl: `0px 5px 30px rgb(var(--mui-mainColorChannels-${mode}Shadow) / ${mode === 'light' ? 0.18 : 0.24})`, + primary: { + sm: '0px 2px 6px rgb(var(--mui-palette-primary-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-primary-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-primary-mainChannel) / 0.5)' + }, + secondary: { + sm: '0px 2px 6px rgb(var(--mui-palette-secondary-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-secondary-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-secondary-mainChannel) / 0.5)' + }, + error: { + sm: '0px 2px 6px rgb(var(--mui-palette-error-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-error-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-error-mainChannel) / 0.5)' + }, + warning: { + sm: '0px 2px 6px rgb(var(--mui-palette-warning-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-warning-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-warning-mainChannel) / 0.5)' + }, + info: { + sm: '0px 2px 6px rgb(var(--mui-palette-info-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-info-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-info-mainChannel) / 0.5)' + }, + success: { + sm: '0px 2px 6px rgb(var(--mui-palette-success-mainChannel) / 0.3)', + md: '0px 4px 16px rgb(var(--mui-palette-success-mainChannel) / 0.4)', + lg: '0px 6px 20px rgb(var(--mui-palette-success-mainChannel) / 0.5)' + } + } +} + +export default customShadows diff --git a/src/@core/theme/index.ts b/src/@core/theme/index.ts new file mode 100644 index 0000000..5bf1dda --- /dev/null +++ b/src/@core/theme/index.ts @@ -0,0 +1,49 @@ +// Next Imports +import { Public_Sans } from 'next/font/google' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Settings } from '@core/contexts/settingsContext' +import type { SystemMode, Skin } from '@core/types' + +// Theme Options Imports +import overrides from './overrides' +import colorSchemes from './colorSchemes' +import spacing from './spacing' +import shadows from './shadows' +import customShadows from './customShadows' +import typography from './typography' + +const public_sans = Public_Sans({ subsets: ['latin'], weight: ['300', '400', '500', '600', '700', '800', '900'] }) + +const theme = (settings: Settings, mode: SystemMode, direction: Theme['direction']): Theme => { + return { + direction, + components: overrides(settings.skin as Skin), + colorSchemes: colorSchemes(settings.skin as Skin), + ...spacing, + shape: { + borderRadius: 6, + customBorderRadius: { + xs: 2, + sm: 4, + md: 6, + lg: 8, + xl: 10 + } + }, + shadows: shadows(mode), + typography: typography(public_sans.style.fontFamily), + customShadows: customShadows(mode), + mainColorChannels: { + light: '47 43 61', + dark: '225 222 245', + lightShadow: '47 43 61', + darkShadow: '19 17 32' + } + } as Theme +} + +export default theme diff --git a/src/@core/theme/overrides/accordion.tsx b/src/@core/theme/overrides/accordion.tsx new file mode 100644 index 0000000..d9e66e5 --- /dev/null +++ b/src/@core/theme/overrides/accordion.tsx @@ -0,0 +1,86 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const accordion = (skin: Skin): Theme['components'] => ({ + MuiAccordion: { + defaultProps: { + ...(skin === 'bordered' && { + variant: 'outlined' + }) + }, + styleOverrides: { + root: ({ theme }) => ({ + transition: theme.transitions.create(['margin', 'border-radius', 'box-shadow']), + '&:not(:last-child)': { + marginBlockEnd: theme.spacing(2) + }, + borderRadius: 'var(--mui-shape-borderRadius)', + ...(skin !== 'bordered' && { + boxShadow: 'var(--mui-customShadows-xs)' + }), + '&:before': { + content: 'none' + }, + '&.Mui-expanded': { + ...(skin !== 'bordered' && { + boxShadow: 'var(--mui-customShadows-md)' + }), + marginBlockStart: 0 + } + }) + } + }, + MuiAccordionSummary: { + defaultProps: { + expandIcon: + }, + styleOverrides: { + root: ({ theme }) => ({ + minHeight: 46, + padding: theme.spacing(3, 5), + paddingInlineStart: theme.spacing(6), + gap: theme.spacing(2), + color: 'var(--mui-palette-text-primary)', + '&.Mui-expanded': { + minHeight: 46, + '& .MuiAccordionSummary-expandIconWrapper': { + transform: 'rotate(90deg)' + } + }, + '& .MuiAccordionSummary-expandIconWrapper': { + transform: theme.direction === 'rtl' && 'rotate(180deg)' + }, + '& .MuiTypography-root': { + color: 'inherit', + fontWeight: theme.typography.fontWeightMedium + } + }), + content: { + margin: '0 !important' + }, + expandIconWrapper: { + color: 'var(--mui-palette-text-primary)', + fontSize: '1.25rem', + '& i, & svg': { + fontSize: 'inherit' + } + } + } + }, + MuiAccordionDetails: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + paddingTop: theme.spacing(0), + '& .MuiTypography-root': { + color: 'var(--mui-palette-text-secondary)' + } + }) + } + } +}) + +export default accordion diff --git a/src/@core/theme/overrides/alert.tsx b/src/@core/theme/overrides/alert.tsx new file mode 100644 index 0000000..fb1e262 --- /dev/null +++ b/src/@core/theme/overrides/alert.tsx @@ -0,0 +1,180 @@ +// React Imports +import React from 'react' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const alerts: Theme['components'] = { + MuiAlert: { + defaultProps: { + iconMapping: { + error: , + warning: , + info: , + success: + } + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(3, 4), + gap: theme.spacing(4), + ...theme.typography.body1, + '&:not(:has(.MuiAlertTitle-root))': { + '& .MuiAlert-icon + .MuiAlert-message': { + alignSelf: 'center' + } + }, + variants: [ + { + props: { variant: 'standard', severity: 'error' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-error-main)', + color: 'var(--mui-palette-error-contrastText)' + } + } + }, + { + props: { variant: 'standard', severity: 'warning' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-warning-main)', + color: 'var(--mui-palette-warning-contrastText)' + } + } + }, + { + props: { variant: 'standard', severity: 'info' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-info-main)', + color: 'var(--mui-palette-info-contrastText)' + } + } + }, + { + props: { variant: 'standard', severity: 'success' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-success-main)', + color: 'var(--mui-palette-success-contrastText)' + } + } + }, + { + props: { variant: 'outlined', severity: 'error' }, + style: { + borderColor: 'var(--mui-palette-error-main)', + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-error-lightOpacity)', + color: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { variant: 'outlined', severity: 'warning' }, + style: { + borderColor: 'var(--mui-palette-warning-main)', + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-warning-lightOpacity)', + color: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { variant: 'outlined', severity: 'info' }, + style: { + borderColor: 'var(--mui-palette-info-main)', + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-info-lightOpacity)', + color: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { variant: 'outlined', severity: 'success' }, + style: { + borderColor: 'var(--mui-palette-success-main)', + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-success-lightOpacity)', + color: 'var(--mui-palette-success-main)' + } + } + }, + { + props: { variant: 'filled', severity: 'error' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-common-white)', + color: 'var(--mui-palette-error-main)', + boxShadow: 'var(--mui-customShadows-xs)' + } + } + }, + { + props: { variant: 'filled', severity: 'warning' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-common-white)', + color: 'var(--mui-palette-warning-main)', + boxShadow: 'var(--mui-customShadows-xs)' + } + } + }, + { + props: { variant: 'filled', severity: 'info' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-common-white)', + color: 'var(--mui-palette-info-main)', + boxShadow: 'var(--mui-customShadows-xs)' + } + } + }, + { + props: { variant: 'filled', severity: 'success' }, + style: { + '& .MuiAlert-icon': { + backgroundColor: 'var(--mui-palette-common-white)', + color: 'var(--mui-palette-success-main)', + boxShadow: 'var(--mui-customShadows-xs)' + } + } + } + ] + }), + icon: { + padding: 0, + margin: 0, + minInlineSize: 30, + blockSize: 30, + borderRadius: 'var(--mui-shape-borderRadius)', + alignItems: 'center', + justifyContent: 'center', + '& i, & svg': { + fontSize: 'inherit' + } + }, + message: { + padding: 0 + }, + action: { + padding: 0, + marginRight: 0 + } + } + }, + MuiAlertTitle: { + styleOverrides: { + root: ({ theme }) => ({ + fontSize: theme.typography.h5.fontSize, + lineHeight: 1.33333, + marginTop: 0, + marginBottom: theme.spacing(1), + color: 'inherit' + }) + } + } +} + +export default alerts diff --git a/src/@core/theme/overrides/autocomplete.tsx b/src/@core/theme/overrides/autocomplete.tsx new file mode 100644 index 0000000..6ce9c23 --- /dev/null +++ b/src/@core/theme/overrides/autocomplete.tsx @@ -0,0 +1,79 @@ +// React Imports +import React from 'react' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const autocomplete = (skin: Skin): Theme['components'] => ({ + MuiAutocomplete: { + defaultProps: { + ...(skin === 'bordered' && { + slotProps: { + paper: { + variant: 'outlined' + } + } + }), + ChipProps: { + size: 'small' + }, + popupIcon: + }, + styleOverrides: { + root: { + '& .MuiButtonBase-root.Mui-disabled i, & .MuiButtonBase-root.Mui-disabled svg': { + color: 'var(--mui-palette-action-disabled)' + }, + '& .MuiOutlinedInput-input': { + height: '1.4375em' + } + }, + input: { + '& + .MuiAutocomplete-endAdornment': { + right: '1rem', + '& i, & svg': { + fontSize: '1.25rem', + color: 'var(--mui-palette-text-primary)' + }, + '& .MuiAutocomplete-clearIndicator': { + padding: 2 + } + }, + '&.MuiInputBase-inputSizeSmall + .MuiAutocomplete-endAdornment': { + '& i, & svg': { + fontSize: '1rem' + } + } + }, + paper: { + ...(skin !== 'bordered' && { + boxShadow: 'var(--mui-customShadows-lg)', + marginBlockStart: '0.125rem' + }) + }, + listbox: ({ theme }) => ({ + '& .MuiAutocomplete-option': { + paddingBlock: theme.spacing(2), + marginInline: theme.spacing(2), + marginBlock: theme.spacing(0.5), + borderRadius: 'var(--mui-shape-borderRadius)', + '&[aria-selected="true"]': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + '&.Mui-focused, &.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + } + } + }, + '& .MuiAutocomplete-option.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-action-hover)' + } + }) + } + } +}) + +export default autocomplete diff --git a/src/@core/theme/overrides/avatar.ts b/src/@core/theme/overrides/avatar.ts new file mode 100644 index 0000000..512a048 --- /dev/null +++ b/src/@core/theme/overrides/avatar.ts @@ -0,0 +1,38 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const avatar: Theme['components'] = { + MuiAvatarGroup: { + styleOverrides: { + root: ({ theme }) => ({ + justifyContent: 'flex-end', + '& .MuiAvatar-root': { + borderColor: 'var(--mui-palette-background-paper)' + }, + '&.pull-up .MuiAvatar-root': { + cursor: 'pointer', + transition: theme.transitions.create(['box-shadow', 'transform'], { + easing: 'ease', + duration: theme.transitions.duration.shorter + }), + '&:hover': { + zIndex: 2, + boxShadow: 'var(--mui-customShadows-md)', + transform: 'translateY(-5px)' + } + } + }) + } + }, + MuiAvatar: { + styleOverrides: { + root: ({ theme }) => ({ + color: 'var(--mui-palette-text-primary)', + fontSize: theme.typography.body1.fontSize, + lineHeight: 1.2 + }) + } + } +} + +export default avatar diff --git a/src/@core/theme/overrides/backdrop.ts b/src/@core/theme/overrides/backdrop.ts new file mode 100644 index 0000000..7a596aa --- /dev/null +++ b/src/@core/theme/overrides/backdrop.ts @@ -0,0 +1,16 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const backdrop: Theme['components'] = { + MuiBackdrop: { + styleOverrides: { + root: { + '&:not(.MuiBackdrop-invisible)': { + backgroundColor: 'var(--backdrop-color)' + } + } + } + } +} + +export default backdrop diff --git a/src/@core/theme/overrides/badges.ts b/src/@core/theme/overrides/badges.ts new file mode 100644 index 0000000..616f987 --- /dev/null +++ b/src/@core/theme/overrides/badges.ts @@ -0,0 +1,19 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const badges: Theme['components'] = { + MuiBadge: { + styleOverrides: { + standard: ({ theme }) => ({ + height: 24, + minWidth: 24, + borderRadius: 20, + fontSize: theme.typography.subtitle2.fontSize, + lineHeight: 1.23077, + padding: theme.spacing(1, 2) + }) + } + } +} + +export default badges diff --git a/src/@core/theme/overrides/breadcrumbs.ts b/src/@core/theme/overrides/breadcrumbs.ts new file mode 100644 index 0000000..13a73b0 --- /dev/null +++ b/src/@core/theme/overrides/breadcrumbs.ts @@ -0,0 +1,26 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const breadcrumbs: Theme['components'] = { + MuiBreadcrumbs: { + styleOverrides: { + root: { + '& svg, & i': { + fontSize: '1.25rem' + }, + '& a': { + textDecoration: 'none', + color: 'var(--mui-palette-primary-main)' + } + }, + li: ({ theme }) => ({ + lineHeight: theme.typography.body1.lineHeight, + '& > *:not(a)': { + color: 'var(--mui-palette-text-primary)' + } + }) + } + } +} + +export default breadcrumbs diff --git a/src/@core/theme/overrides/button-group.ts b/src/@core/theme/overrides/button-group.ts new file mode 100644 index 0000000..f620fcc --- /dev/null +++ b/src/@core/theme/overrides/button-group.ts @@ -0,0 +1,279 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +const buttonGroup: Theme['components'] = { + MuiButtonGroup: { + defaultProps: { + disableRipple: themeConfig.disableRipple + }, + styleOverrides: { + root: { + variants: [ + { + props: { variant: 'text', color: 'primary' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-primary-main)' + } + } + } + }, + { + props: { variant: 'text', color: 'secondary' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-secondary-main)' + } + } + } + }, + { + props: { variant: 'text', color: 'error' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-error-main)' + } + } + } + }, + { + props: { variant: 'text', color: 'warning' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-warning-main)' + } + } + } + }, + { + props: { variant: 'text', color: 'info' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-info-main)' + } + } + } + }, + { + props: { variant: 'text', color: 'success' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-success-main)' + } + } + } + }, + { + props: { variant: 'contained', color: 'primary' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-primary-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-primary-dark)' + } + } + } + }, + { + props: { variant: 'contained', color: 'secondary' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-secondary-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-secondary-dark)' + } + } + } + }, + { + props: { variant: 'contained', color: 'error' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-error-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-error-dark)' + } + } + } + }, + { + props: { variant: 'contained', color: 'warning' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-warning-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-warning-dark)' + } + } + } + }, + { + props: { variant: 'contained', color: 'info' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-info-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-info-dark)' + } + } + } + }, + { + props: { variant: 'contained', color: 'success' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-success-sm)' + }, + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderColor: 'var(--mui-palette-success-dark)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'primary', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-primary-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'secondary', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-secondary-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'error', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-error-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'warning', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-warning-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'info', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-info-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'success', orientation: 'horizontal' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderRight: '1px solid var(--mui-palette-success-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'primary', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-primary-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'secondary', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-secondary-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'error', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-error-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'warning', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-warning-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'info', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-info-darkOpacity)' + } + } + } + }, + { + props: { variant: 'tonal', color: 'success', orientation: 'vertical' }, + style: { + '& .MuiButtonGroup-firstButton, & .MuiButtonGroup-middleButton': { + '&, &.Mui-disabled': { + borderBottom: '1px solid var(--mui-palette-success-darkOpacity)' + } + } + } + } + ] + } + } + } +} + +export default buttonGroup diff --git a/src/@core/theme/overrides/button.ts b/src/@core/theme/overrides/button.ts new file mode 100644 index 0000000..91fb678 --- /dev/null +++ b/src/@core/theme/overrides/button.ts @@ -0,0 +1,459 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +const iconStyles = (size?: string) => ({ + '& > *:nth-of-type(1)': { + ...(size === 'small' + ? { + fontSize: '14px' + } + : { + ...(size === 'medium' + ? { + fontSize: '16px' + } + : { + fontSize: '20px' + }) + }) + } +}) + +const button: Theme['components'] = { + MuiButtonBase: { + defaultProps: { + disableRipple: themeConfig.disableRipple + } + }, + MuiButton: { + styleOverrides: { + root: ({ theme, ownerState }) => ({ + '&.Mui-disabled': { + opacity: 0.45 + }, + transition: theme.transitions.create('all', { + duration: theme.transitions.duration.short + }), + '&:not(.Mui-disabled):active': { + transform: 'scale(0.98)' + }, + ...(ownerState.variant === 'text' + ? { + ...(ownerState.size === 'small' && { + padding: theme.spacing(1.5, 2.25) + }), + ...(ownerState.size === 'medium' && { + padding: theme.spacing(2, 3) + }), + ...(ownerState.size === 'large' && { + padding: theme.spacing(2.75, 4) + }) + } + : { + ...(ownerState.variant === 'outlined' + ? { + ...(ownerState.size === 'small' && { + padding: theme.spacing(1.25, 3.25) + }), + ...(ownerState.size === 'medium' && { + padding: theme.spacing(1.75, 4.75) + }), + ...(ownerState.size === 'large' && { + padding: theme.spacing(2.5, 6.25) + }) + } + : { + ...(ownerState.size === 'small' && { + padding: theme.spacing(1.5, 3.5) + }), + ...(ownerState.size === 'medium' && { + padding: theme.spacing(2, 5) + }), + ...(ownerState.size === 'large' && { + padding: theme.spacing(2.75, 6.5) + }) + }) + }), + variants: [ + { + props: { variant: 'text', color: 'primary' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-primary-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { variant: 'text', color: 'secondary' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-secondary-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-secondary-main)' + } + } + }, + { + props: { variant: 'text', color: 'error' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-error-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { variant: 'text', color: 'warning' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-warning-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { variant: 'text', color: 'info' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-info-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { variant: 'text', color: 'success' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-success-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-success-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'primary' }, + style: { + borderColor: 'var(--mui-palette-primary-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-primary-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-primary-main)', + borderColor: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'secondary' }, + style: { + borderColor: 'var(--mui-palette-secondary-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-secondary-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-secondary-main)', + borderColor: 'var(--mui-palette-secondary-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'error' }, + style: { + borderColor: 'var(--mui-palette-error-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-error-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-error-main)', + borderColor: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'warning' }, + style: { + borderColor: 'var(--mui-palette-warning-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-warning-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-warning-main)', + borderColor: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'info' }, + style: { + borderColor: 'var(--mui-palette-info-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-info-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-info-main)', + borderColor: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { variant: 'outlined', color: 'success' }, + style: { + borderColor: 'var(--mui-palette-success-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-success-lighterOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-success-main)', + borderColor: 'var(--mui-palette-success-main)' + } + } + }, + { + props: { variant: 'contained', color: 'primary' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-primary-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-primary-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-primary-contrastText)', + backgroundColor: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { variant: 'contained', color: 'secondary' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-secondary-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-secondary-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-secondary-contrastText)', + backgroundColor: 'var(--mui-palette-secondary-main)' + } + } + }, + { + props: { variant: 'contained', color: 'error' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-error-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-error-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-error-contrastText)', + backgroundColor: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { variant: 'contained', color: 'warning' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-warning-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-warning-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-warning-contrastText)', + backgroundColor: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { variant: 'contained', color: 'info' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-info-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-info-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-info-contrastText)', + backgroundColor: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { variant: 'contained', color: 'success' }, + style: { + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-success-sm)' + }, + '&:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-success-dark)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-success-contrastText)', + backgroundColor: 'var(--mui-palette-success-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'primary' }, + style: { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'secondary' }, + style: { + backgroundColor: 'var(--mui-palette-secondary-lightOpacity)', + color: 'var(--mui-palette-secondary-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-secondary-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-secondary-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'error' }, + style: { + backgroundColor: 'var(--mui-palette-error-lightOpacity)', + color: 'var(--mui-palette-error-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-error-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'warning' }, + style: { + backgroundColor: 'var(--mui-palette-warning-lightOpacity)', + color: 'var(--mui-palette-warning-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-warning-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'info' }, + style: { + backgroundColor: 'var(--mui-palette-info-lightOpacity)', + color: 'var(--mui-palette-info-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-info-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'success' }, + style: { + backgroundColor: 'var(--mui-palette-success-lightOpacity)', + color: 'var(--mui-palette-success-main)', + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active, &.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': + { + backgroundColor: 'var(--mui-palette-success-mainOpacity)' + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-success-main)' + } + } + } + ] + }), + sizeSmall: ({ theme }) => ({ + lineHeight: 1.38462, + fontSize: theme.typography.body2.fontSize, + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + }), + sizeLarge: { + fontSize: '1.0625rem', + lineHeight: 1.529412, + borderRadius: 'var(--mui-shape-customBorderRadius-lg)' + }, + startIcon: ({ theme, ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + marginInlineEnd: theme.spacing(1.5) + } + : { + ...(ownerState.size === 'medium' + ? { + marginInlineEnd: theme.spacing(2) + } + : { + marginInlineEnd: theme.spacing(2.5) + }) + }), + ...iconStyles(ownerState.size) + }), + endIcon: ({ theme, ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + marginInlineStart: theme.spacing(1.5) + } + : { + ...(ownerState.size === 'medium' + ? { + marginInlineStart: theme.spacing(2) + } + : { + marginInlineStart: theme.spacing(2.5) + }) + }), + ...iconStyles(ownerState.size) + }) + } + } +} + +export default button diff --git a/src/@core/theme/overrides/card.ts b/src/@core/theme/overrides/card.ts new file mode 100644 index 0000000..76c2677 --- /dev/null +++ b/src/@core/theme/overrides/card.ts @@ -0,0 +1,94 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const card = (skin: Skin): Theme['components'] => { + return { + MuiCard: { + defaultProps: { + ...(skin === 'bordered' && { + variant: 'outlined' + }) + }, + styleOverrides: { + root: ({ ownerState }) => ({ + ...(ownerState.variant !== 'outlined' && { + boxShadow: 'var(--mui-customShadows-md)' + }) + }) + } + }, + MuiCardHeader: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + '& + .MuiCardContent-root, & + .MuiCardActions-root': { + paddingBlockStart: 0 + }, + '& + .MuiCollapse-root .MuiCardContent-root:first-child, & + .MuiCollapse-root .MuiCardActions-root:first-child': + { + paddingBlockStart: 0 + } + }), + subheader: ({ theme }) => ({ + ...theme.typography.subtitle1, + color: 'rgb(var(--mui-palette-text-primaryChannel) / 0.55)' + }), + action: ({ theme }) => ({ + ...theme.typography.body1, + color: 'var(--mui-palette-text-disabled)', + marginBlock: 0, + marginInlineEnd: 0, + '& .MuiIconButton-root': { + color: 'inherit' + } + }) + } + }, + MuiCardContent: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + color: 'var(--mui-palette-text-secondary)', + '&:last-child': { + paddingBlockEnd: theme.spacing(6) + }, + '& + .MuiCardHeader-root, & + .MuiCardContent-root, & + .MuiCardActions-root': { + paddingBlockStart: 0 + }, + '& + .MuiCollapse-root .MuiCardHeader-root:first-child, & + .MuiCollapse-root .MuiCardContent-root:first-child, & + .MuiCollapse-root .MuiCardActions-root:first-child': + { + paddingBlockStart: 0 + } + }) + } + }, + MuiCardActions: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + '& .MuiButtonBase-root:not(:first-of-type)': { + marginInlineStart: theme.spacing(4) + }, + '&:where(.card-actions-dense)': { + padding: theme.spacing(3), + '& .MuiButton-text': { + paddingInline: theme.spacing(3) + } + }, + '& + .MuiCardHeader-root, & + .MuiCardContent-root, & + .MuiCardActions-root': { + paddingBlockStart: 0 + }, + '& + .MuiCollapse-root .MuiCardHeader-root:first-child, & + .MuiCollapse-root .MuiCardContent-root:first-child, & + .MuiCollapse-root .MuiCardActions-root:first-child': + { + paddingBlockStart: 0 + } + }) + } + } + } +} + +export default card diff --git a/src/@core/theme/overrides/checkbox.tsx b/src/@core/theme/overrides/checkbox.tsx new file mode 100644 index 0000000..e5e8b3b --- /dev/null +++ b/src/@core/theme/overrides/checkbox.tsx @@ -0,0 +1,107 @@ +// React Imports +import React from 'react' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const Icon = () => { + return ( + + + + ) +} + +const IndeterminateIcon = () => { + return ( + + + + + ) +} + +const CheckedIcon = () => { + return ( + + + + + ) +} + +const checkbox: Theme['components'] = { + MuiCheckbox: { + defaultProps: { + icon: , + indeterminateIcon: , + checkedIcon: + }, + styleOverrides: { + root: ({ theme, ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + padding: theme.spacing(1), + '& svg': { + fontSize: '1.25rem' + } + } + : { + padding: theme.spacing(1.5), + '& svg': { + fontSize: '1.5rem' + } + }), + '&:not(.Mui-checked):not(.Mui-disabled):not(.MuiCheckbox-indeterminate) svg, &:not(.Mui-checked):not(.Mui-disabled):not(.MuiCheckbox-indeterminate) i': + { + color: 'var(--mui-palette-text-disabled)' + }, + '&.Mui-checked:not(.Mui-disabled) svg, &.MuiCheckbox-indeterminate:not(.Mui-disabled) svg': { + filter: `drop-shadow(var(--mui-customShadows-${ownerState.color}-sm))` + }, + '&.Mui-disabled': { + opacity: 0.45, + '&:not(.Mui-checked)': { + color: 'var(--mui-palette-text-disabled)' + }, + '&.Mui-checked.MuiCheckbox-colorPrimary': { + color: 'var(--mui-palette-primary-main)' + }, + '&.Mui-checked.MuiCheckbox-colorSecondary': { + color: 'var(--mui-palette-secondary-main)' + }, + '&.Mui-checked.MuiCheckbox-colorError': { + color: 'var(--mui-palette-error-main)' + }, + '&.Mui-checked.MuiCheckbox-colorWarning': { + color: 'var(--mui-palette-warning-main)' + }, + '&.Mui-checked.MuiCheckbox-colorInfo': { + color: 'var(--mui-palette-info-main)' + }, + '&.Mui-checked.MuiCheckbox-colorSuccess': { + color: 'var(--mui-palette-success-main)' + } + } + }) + } + } +} + +export default checkbox diff --git a/src/@core/theme/overrides/chip.ts b/src/@core/theme/overrides/chip.ts new file mode 100644 index 0000000..1396e38 --- /dev/null +++ b/src/@core/theme/overrides/chip.ts @@ -0,0 +1,204 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const chip: Theme['components'] = { + MuiChip: { + styleOverrides: { + root: ({ ownerState, theme }) => ({ + ...theme.typography.body2, + fontWeight: theme.typography.fontWeightMedium, + '&.MuiChip-outlined:not(.MuiChip-colorDefault)': { + borderColor: `var(--mui-palette-${ownerState.color}-main)` + }, + ...(ownerState.size === 'small' + ? { + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + } + : { + borderRadius: 'var(--mui-shape-borderRadius)' + }), + + '& .MuiChip-deleteIcon': { + ...(ownerState.size === 'small' + ? { + fontSize: '1rem', + marginInlineEnd: theme.spacing(1), + marginInlineStart: theme.spacing(-2) + } + : { + fontSize: '1.25rem', + marginInlineEnd: theme.spacing(1.5), + marginInlineStart: theme.spacing(-2) + }) + }, + '& .MuiChip-avatar, & .MuiChip-icon': { + '& i, & svg': { + ...(ownerState.size === 'small' + ? { + fontSize: 13 + } + : { + fontSize: 15 + }) + }, + ...(ownerState.size === 'small' + ? { + blockSize: 16, + inlineSize: 16, + marginInlineStart: theme.spacing(1), + marginInlineEnd: theme.spacing(-1.5) + } + : { + blockSize: 20, + inlineSize: 20, + marginInlineStart: theme.spacing(1.5), + marginInlineEnd: theme.spacing(-2) + }) + }, + '&.Mui-disabled': { + opacity: 0.45 + }, + variants: [ + { + props: { variant: 'tonal', color: 'primary' }, + style: { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-primary-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-primary-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-primary-main)', + color: 'var(--mui-palette-common-white)' + } + } + }, + { + props: { variant: 'tonal', color: 'secondary' }, + style: { + backgroundColor: 'var(--mui-palette-secondary-lightOpacity)', + color: 'var(--mui-palette-secondary-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-secondary-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-secondary-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-secondary-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-secondary-main)', + color: 'var(--mui-palette-common-white)' + } + } + }, + { + props: { variant: 'tonal', color: 'error' }, + style: { + backgroundColor: 'var(--mui-palette-error-lightOpacity)', + color: 'var(--mui-palette-error-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-error-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-error-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-error-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-error-main)', + color: 'var(--mui-palette-common-white)' + } + } + }, + { + props: { variant: 'tonal', color: 'warning' }, + style: { + backgroundColor: 'var(--mui-palette-warning-lightOpacity)', + color: 'var(--mui-palette-warning-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-warning-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-warning-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-warning-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-warning-main)', + color: 'var(--mui-palette-common-white)' + } + } + }, + { + props: { variant: 'tonal', color: 'info' }, + style: { + backgroundColor: 'var(--mui-palette-info-lightOpacity)', + color: 'var(--mui-palette-info-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-info-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-info-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-info-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-info-main)', + color: 'var(--mui-palette-common-white)' + } + } + }, + { + props: { variant: 'tonal', color: 'success' }, + style: { + backgroundColor: 'var(--mui-palette-success-lightOpacity)', + color: 'var(--mui-palette-success-main)', + '&.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-success-mainOpacity)' + }, + '& .MuiChip-deleteIcon': { + color: 'rgb(var(--mui-palette-success-mainChannel) / 0.7)', + '&:hover': { + color: 'var(--mui-palette-success-main)' + } + }, + '&.MuiChip-clickable:hover': { + backgroundColor: 'var(--mui-palette-success-main)', + color: 'var(--mui-palette-common-white)' + } + } + } + ] + }), + label: ({ ownerState, theme }) => ({ + ...(ownerState.size === 'small' + ? { + paddingInline: theme.spacing(2.5), + paddingBlock: theme.spacing(0.5) + } + : { + paddingInline: theme.spacing(3) + }) + }), + iconMedium: { + fontSize: '1.25rem' + }, + iconSmall: { + fontSize: '1rem' + } + } + } +} + +export default chip diff --git a/src/@core/theme/overrides/dialog.ts b/src/@core/theme/overrides/dialog.ts new file mode 100644 index 0000000..36a82e4 --- /dev/null +++ b/src/@core/theme/overrides/dialog.ts @@ -0,0 +1,71 @@ +//MUI Imports +import type { Theme } from '@mui/material/styles' + +//Type Imports +import type { Skin } from '@core/types' + +const dialog = (skin: Skin): Theme['components'] => ({ + MuiDialog: { + styleOverrides: { + paper: ({ theme }) => ({ + borderRadius: 'var(--mui-shape-customBorderRadius-lg)', + ...(skin !== 'bordered' + ? { + boxShadow: 'var(--mui-customShadows-lg)' + } + : { + boxShadow: 'none' + }), + [theme.breakpoints.down('sm')]: { + '&:not(.MuiDialog-paperFullScreen)': { + margin: theme.spacing(6) + } + } + }), + paperFullScreen: { + borderRadius: 0 + } + } + }, + MuiDialogTitle: { + defaultProps: { + variant: 'h5' + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + '& + .MuiDialogActions-root': { + paddingTop: 0 + } + }) + } + }, + MuiDialogContent: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + '& + .MuiDialogContent-root, & + .MuiDialogActions-root': { + paddingTop: 0 + } + }) + } + }, + MuiDialogActions: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(6), + '& .MuiButtonBase-root:not(:first-of-type)': { + marginInlineStart: theme.spacing(4) + }, + '&:where(.dialog-actions-dense)': { + padding: theme.spacing(3), + '& .MuiButton-text': { + paddingInline: theme.spacing(3) + } + } + }) + } + } +}) + +export default dialog diff --git a/src/@core/theme/overrides/drawer.ts b/src/@core/theme/overrides/drawer.ts new file mode 100644 index 0000000..6a90b55 --- /dev/null +++ b/src/@core/theme/overrides/drawer.ts @@ -0,0 +1,26 @@ +// MUI Imports +import type { Theme } from '@mui/material' + +// Type Imports +import type { Skin } from '@core/types' + +const drawer = (skin: Skin): Theme['components'] => ({ + MuiDrawer: { + defaultProps: { + ...(skin === 'bordered' && { + PaperProps: { + elevation: 0 + } + }) + }, + styleOverrides: { + paper: { + ...(skin !== 'bordered' && { + boxShadow: 'var(--mui-customShadows-lg)' + }) + } + } + } +}) + +export default drawer diff --git a/src/@core/theme/overrides/fab.ts b/src/@core/theme/overrides/fab.ts new file mode 100644 index 0000000..c7fd30c --- /dev/null +++ b/src/@core/theme/overrides/fab.ts @@ -0,0 +1,72 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const fab: Theme['components'] = { + MuiFab: { + styleOverrides: { + root: { + variants: [ + { + props: { color: 'default' }, + style: { + color: 'rgb(var(--mui-mainColorChannels-light) / 0.9)', + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-grey-A100)' + } + } + }, + { + props: { color: 'primary' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-primary-dark)' + } + } + }, + { + props: { color: 'secondary' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-secondary-dark)' + } + } + }, + { + props: { color: 'error' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-error-dark)' + } + } + }, + { + props: { color: 'warning' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-warning-dark)' + } + } + }, + { + props: { color: 'info' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-info-dark)' + } + } + }, + { + props: { color: 'success' }, + style: { + '&.Mui-focusVisible:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'var(--mui-palette-success-dark)' + } + } + } + ] + } + } + } +} + +export default fab diff --git a/src/@core/theme/overrides/form-control-label.ts b/src/@core/theme/overrides/form-control-label.ts new file mode 100644 index 0000000..fb6a503 --- /dev/null +++ b/src/@core/theme/overrides/form-control-label.ts @@ -0,0 +1,22 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const formControlLabel: Theme['components'] = { + MuiFormControlLabel: { + styleOverrides: { + root: ({ theme }) => ({ + marginInlineStart: theme.spacing(-2) + }), + label: { + '&, &.Mui-disabled': { + color: 'var(--mui-palette-text-primary)' + }, + '&.Mui-disabled': { + opacity: 0.45 + } + } + } + } +} + +export default formControlLabel diff --git a/src/@core/theme/overrides/icon-button.ts b/src/@core/theme/overrides/icon-button.ts new file mode 100644 index 0000000..2e29a8d --- /dev/null +++ b/src/@core/theme/overrides/icon-button.ts @@ -0,0 +1,148 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +const iconButton: Theme['components'] = { + MuiIconButton: { + styleOverrides: { + root: { + '& .MuiSvgIcon-root, & i, & svg': { + fontSize: 'inherit' + }, + variants: [ + { + props: { color: 'default' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'rgb(var(--mui-palette-text-primaryChannel) / 0.08)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'rgb(var(--mui-palette-text-primaryChannel) / 0.08)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-action-active)' + } + } + }, + { + props: { color: 'primary' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-primary-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'var(--mui-palette-primary-lighterOpacity)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { color: 'secondary' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-secondary-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'var(--mui-palette-secondary-lighterOpacity)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-secondary-main)' + } + } + }, + { + props: { color: 'error' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-error-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { backgroundColor: 'var(--mui-palette-error-lighterOpacity)' } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-error-main)' + } + } + }, + { + props: { color: 'warning' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-warning-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'var(--mui-palette-warning-lighterOpacity)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-warning-main)' + } + } + }, + { + props: { color: 'info' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-info-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { backgroundColor: 'var(--mui-palette-info-lighterOpacity)' } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-info-main)' + } + } + }, + { + props: { color: 'success' }, + style: { + '&:not(.Mui-disabled):hover, &:not(.Mui-disabled):active': { + backgroundColor: 'var(--mui-palette-success-lighterOpacity)' + }, + ...(themeConfig.disableRipple && { + '&.Mui-focusVisible:not(.Mui-disabled)': { + backgroundColor: 'var(--mui-palette-success-lighterOpacity)' + } + }), + '&.Mui-disabled': { + opacity: 0.45, + color: 'var(--mui-palette-success-main)' + } + } + } + ] + }, + sizeSmall: ({ theme }) => ({ + padding: theme.spacing(1.25), + fontSize: '1.25rem' + }), + sizeMedium: ({ theme }) => ({ + padding: theme.spacing(2), + fontSize: '1.375rem' + }), + sizeLarge: ({ theme }) => ({ + padding: theme.spacing(3), + fontSize: '1.5rem' + }) + } + } +} + +export default iconButton diff --git a/src/@core/theme/overrides/index.ts b/src/@core/theme/overrides/index.ts new file mode 100644 index 0000000..c5ab4f0 --- /dev/null +++ b/src/@core/theme/overrides/index.ts @@ -0,0 +1,84 @@ +// Type Imports +import type { Skin } from '@core/types' + +// Override Imports +import Accordion from './accordion' +import Alerts from './alert' +import Autocomplete from './autocomplete' +import avatar from './avatar' +import backdrop from './backdrop' +import badges from './badges' +import breadcrumbs from './breadcrumbs' +import button from './button' +import buttonGroup from './button-group' +import card from './card' +import Checkbox from './checkbox' +import chip from './chip' +import dialog from './dialog' +import drawer from './drawer' +import fab from './fab' +import formControlLabel from './form-control-label' +import iconButton from './icon-button' +import input from './input' +import list from './list' +import menu from './menu' +import pagination from './pagination' +import paper from './paper' +import popover from './popover' +import progress from './progress' +import Radio from './radio' +import Rating from './rating' +import select from './select' +import slider from './slider' +import snackbar from './snackbar' +import switchOverrides from './switch' +import tablePagination from './table-pagination' +import tabs from './tabs' +import timeline from './timeline' +import toggleButton from './toggle-button' +import tooltip from './tooltip' +import typography from './typography' + +const overrides = (skin: Skin) => { + return Object.assign( + {}, + Accordion(skin), + Alerts, + Autocomplete(skin), + avatar, + backdrop, + badges, + breadcrumbs, + button, + buttonGroup, + card(skin), + Checkbox, + chip, + dialog(skin), + drawer(skin), + fab, + formControlLabel, + iconButton, + input, + list, + menu(skin), + pagination, + paper, + popover(skin), + progress, + Radio, + Rating, + select, + slider, + snackbar(skin), + switchOverrides, + tablePagination, + tabs, + timeline, + toggleButton, + tooltip, + typography + ) +} + +export default overrides diff --git a/src/@core/theme/overrides/input.ts b/src/@core/theme/overrides/input.ts new file mode 100644 index 0000000..03fd3f7 --- /dev/null +++ b/src/@core/theme/overrides/input.ts @@ -0,0 +1,120 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const input: Theme['components'] = { + MuiFormControl: { + styleOverrides: { + root: { + '&:has(.MuiRadio-root) .MuiFormHelperText-root, &:has(.MuiCheckbox-root) .MuiFormHelperText-root, &:has(.MuiSwitch-root) .MuiFormHelperText-root': + { + marginInline: 0 + } + } + } + }, + MuiInputBase: { + styleOverrides: { + root: { + lineHeight: 1.6, + '&.MuiInput-underline': { + '&:before': { + borderColor: 'var(--mui-palette-customColors-inputBorder)' + }, + '&:not(.Mui-disabled, .Mui-error):hover:before': { + borderColor: 'var(--mui-palette-action-active)' + } + }, + '&.Mui-disabled .MuiInputAdornment-root, &.Mui-disabled .MuiInputAdornment-root > *': { + color: 'var(--mui-palette-action-disabled)' + } + } + } + }, + MuiFilledInput: { + styleOverrides: { + root: { + borderStartStartRadius: 4, + borderStartEndRadius: 4, + '&:before': { + borderBottom: '1px solid var(--mui-palette-text-secondary)' + }, + '&:hover:before': { + borderBottom: '1px solid var(--mui-palette-text-primary)' + }, + '&.Mui-disabled:before': { + borderBottomStyle: 'solid', + opacity: 0.38 + } + } + } + }, + MuiInputLabel: { + styleOverrides: { + shrink: ({ ownerState }) => ({ + ...(ownerState.variant === 'outlined' && { + transform: 'translate(14px, -8px) scale(0.867)' + }), + ...(ownerState.variant === 'filled' && { + transform: `translate(12px, ${ownerState.size === 'small' ? 4 : 7}px) scale(0.867)` + }), + ...(ownerState.variant === 'standard' && { + transform: 'translate(0, -1.5px) scale(0.867)' + }) + }) + } + }, + MuiOutlinedInput: { + styleOverrides: { + root: { + '&:not(.Mui-focused):not(.Mui-error):not(.Mui-disabled):hover .MuiOutlinedInput-notchedOutline': { + borderColor: 'var(--mui-palette-action-active)' + }, + '&.Mui-disabled .MuiOutlinedInput-notchedOutline': { + borderColor: 'var(--mui-palette-divider)' + }, + '&:not(.Mui-error).MuiInputBase-colorPrimary.Mui-focused': { + boxShadow: 'var(--mui-customShadows-primary-sm)' + } + }, + input: ({ theme, ownerState }) => ({ + ...(ownerState?.size === 'medium' && { + '&:not(.MuiInputBase-inputMultiline, .MuiInputBase-inputAdornedStart)': { + padding: theme.spacing(4) + }, + height: '1.5em' + }), + '& ~ .MuiOutlinedInput-notchedOutline': { + borderColor: 'var(--mui-palette-customColors-inputBorder)' + } + }), + notchedOutline: { + '& legend': { + fontSize: '0.867em' + } + } + } + }, + MuiInputAdornment: { + styleOverrides: { + root: { + color: 'var(--mui-palette-text-primary)', + '& i, & svg': { + fontSize: '1rem !important' + }, + '& *': { + color: 'inherit !important' + } + } + } + }, + MuiFormHelperText: { + styleOverrides: { + root: { + lineHeight: 1, + letterSpacing: 'unset' + } + } + } +} + +export default input diff --git a/src/@core/theme/overrides/list.ts b/src/@core/theme/overrides/list.ts new file mode 100644 index 0000000..0e04a7f --- /dev/null +++ b/src/@core/theme/overrides/list.ts @@ -0,0 +1,81 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const list: Theme['components'] = { + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + gap: theme.spacing(3) + }), + padding: ({ theme, ownerState }) => ({ + ...(!ownerState.dense && { + paddingBlock: theme.spacing(2), + paddingInlineStart: theme.spacing(5) + }) + }) + } + }, + MuiListItemAvatar: { + styleOverrides: { + root: { + minInlineSize: 'unset' + } + } + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minInlineSize: 0, + color: 'var(--mui-palette-text-primary)', + fontSize: '1.375rem', + '& > svg, & > i': { + fontSize: 'inherit' + } + } + } + }, + MuiListItemButton: { + styleOverrides: { + root: ({ theme, ownerState }) => ({ + gap: theme.spacing(2), + ...(!ownerState.dense && { + paddingBlock: theme.spacing(2) + }), + paddingInlineStart: theme.spacing(5), + '&.Mui-selected': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + '&:hover, &.Mui-focused, &.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + }, + '& .MuiTypography-root': { + color: 'var(--mui-palette-primary-main)' + }, + '& + .MuiListItemSecondaryAction-root .MuiIconButton-root': { + color: 'var(--mui-palette-primary-main)' + } + } + }) + } + }, + MuiListItemText: { + styleOverrides: { + root: { + margin: 0 + }, + primary: { + color: 'var(--mui-palette-text-primary)' + } + } + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + ...theme.typography.subtitle2, + paddingBlock: 10, + paddingInline: theme.spacing(5) + }) + } + } +} + +export default list diff --git a/src/@core/theme/overrides/menu.ts b/src/@core/theme/overrides/menu.ts new file mode 100644 index 0000000..736146b --- /dev/null +++ b/src/@core/theme/overrides/menu.ts @@ -0,0 +1,63 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const menu = (skin: Skin): Theme['components'] => ({ + MuiMenu: { + defaultProps: { + ...(skin === 'bordered' && { + slotProps: { + paper: { + elevation: 0 + } + } + }) + }, + styleOverrides: { + paper: ({ theme }) => ({ + marginBlockStart: theme.spacing(0.5), + ...(skin !== 'bordered' && { + boxShadow: 'var(--mui-customShadows-lg)' + }) + }) + } + }, + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + paddingBlock: theme.spacing(2), + gap: theme.spacing(2), + color: 'var(--mui-palette-text-primary)', + marginInline: theme.spacing(2), + borderRadius: 'var(--mui-shape-borderRadius)', + '& i, & svg': { + fontSize: '1.375rem' + }, + '& .MuiListItemIcon-root': { + minInlineSize: 0 + }, + '&:not(:last-of-type)': { + marginBlockEnd: theme.spacing(0.5) + }, + '&.Mui-selected': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + '& .MuiListItemIcon-root': { + color: 'var(--mui-palette-primary-main)' + }, + '&:hover, &.Mui-focused, &.Mui-focusVisible': { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + } + }, + '&.Mui-disabled': { + color: 'var(--mui-palette-text-disabled)', + opacity: 0.45 + } + }) + } + } +}) + +export default menu diff --git a/src/@core/theme/overrides/pagination.ts b/src/@core/theme/overrides/pagination.ts new file mode 100644 index 0000000..3f2f5ac --- /dev/null +++ b/src/@core/theme/overrides/pagination.ts @@ -0,0 +1,177 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const pagination: Theme['components'] = { + MuiPagination: { + styleOverrides: { + root: { + variants: [ + { + props: { variant: 'text', color: 'primary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected.Mui-disabled': { + backgroundColor: 'var(--mui-palette-primary-main)', + color: 'var(--mui-palette-primary-contrastText)' + } + } + }, + { + props: { variant: 'text', color: 'secondary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected.Mui-disabled': { + backgroundColor: 'var(--mui-palette-secondary-main)', + color: 'var(--mui-palette-secondary-contrastText)' + } + } + }, + { + props: { variant: 'outlined' }, + style: { + '& .MuiPaginationItem-root': { + borderColor: 'var(--mui-palette-customColors-inputBorder)' + } + } + }, + { + props: { variant: 'outlined', color: 'primary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected': { + color: 'var(--mui-palette-primary-main)', + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + borderColor: 'rgb(var(--mui-palette-primary-mainChannel))' + } + } + }, + { + props: { variant: 'outlined', color: 'secondary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected': { + color: 'var(--mui-palette-secondary-main)', + backgroundColor: 'var(--mui-palette-secondary-lightOpacity)', + borderColor: 'rgb(var(--mui-palette-secondary-mainChannel))' + } + } + }, + { + props: { variant: 'tonal' }, + style: { + '& .MuiPaginationItem-root:not(.MuiPaginationItem-ellipsis)': { + backgroundColor: 'var(--mui-palette-action-selected)' + } + } + }, + { + props: { variant: 'tonal', color: 'standard' }, + style: { + '& .MuiPaginationItem-root.Mui-selected': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)', + '&:hover': { + backgroundColor: 'var(--mui-palette-primary-mainOpacity)' + } + }, + '& .MuiPaginationItem-root:hover:not(.Mui-selected):not(.MuiPaginationItem-ellipsis)': { + backgroundColor: 'var(--mui-palette-action-disabledBackground)' + }, + '& .MuiPaginationItem-root.Mui-selected.Mui-disabled': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)' + } + } + }, + { + props: { variant: 'tonal', color: 'primary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected': { + backgroundColor: 'var(--mui-palette-primary-main)', + color: 'var(--mui-palette-primary-contrastText)', + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-primary-sm)' + }, + '&:hover': { + backgroundColor: 'var(--mui-palette-primary-dark)' + } + }, + '& .MuiPaginationItem-root:hover:not(.Mui-selected):not(.MuiPaginationItem-ellipsis)': { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)' + }, + '& .MuiPaginationItem-root.Mui-selected.Mui-disabled': { + backgroundColor: 'var(--mui-palette-primary-main)', + color: 'var(--mui-palette-primary-contrastText)' + } + } + }, + { + props: { variant: 'tonal', color: 'secondary' }, + style: { + '& .MuiPaginationItem-root.Mui-selected': { + backgroundColor: 'var(--mui-palette-secondary-main)', + color: 'var(--mui-palette-secondary-contrastText)', + '&:not(.Mui-disabled)': { + boxShadow: 'var(--mui-customShadows-secondary-sm)' + }, + '&:hover': { + backgroundColor: 'var(--mui-palette-secondary-dark)' + } + }, + '& .MuiPaginationItem-root:hover:not(.Mui-selected):not(.MuiPaginationItem-ellipsis)': { + backgroundColor: 'var(--mui-palette-secondary-mainOpacity)' + }, + '& .MuiPaginationItem-root.Mui-selected.Mui-disabled': { + backgroundColor: 'var(--mui-palette-secondary-main)', + color: 'var(--mui-palette-secondary-contrastText)' + } + } + } + ] + }, + ul: { + rowGap: 6 + } + } + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ ownerState }) => ({ + ...(ownerState.size === 'medium' && { + height: '2.375rem', + minWidth: '2.375rem' + }), + ...(ownerState.shape !== 'rounded' && { + borderRadius: '50px' + }), + '&.Mui-selected.Mui-disabled': { + color: 'var(--mui-palette-text-primary)', + opacity: 0.45 + }, + '&.Mui-disabled': { + opacity: 0.45 + }, + ...(ownerState.shape === 'rounded' && + ownerState.size === 'small' && { + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + }), + ...(ownerState.shape === 'rounded' && + ownerState.size === 'large' && { + borderRadius: 'var(--mui-shape-customBorderRadius-lg)' + }) + }), + ellipsis: { + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center' + }, + sizeSmall: { + height: '1.875rem', + minWidth: '1.875rem' + }, + sizeLarge: { + height: '3rem', + minWidth: '3rem' + } + } + } +} + +export default pagination diff --git a/src/@core/theme/overrides/paper.ts b/src/@core/theme/overrides/paper.ts new file mode 100644 index 0000000..8a0a6ef --- /dev/null +++ b/src/@core/theme/overrides/paper.ts @@ -0,0 +1,14 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const paper: Theme['components'] = { + MuiPaper: { + styleOverrides: { + root: { + backgroundImage: 'none' + } + } + } +} + +export default paper diff --git a/src/@core/theme/overrides/popover.ts b/src/@core/theme/overrides/popover.ts new file mode 100644 index 0000000..0db70cd --- /dev/null +++ b/src/@core/theme/overrides/popover.ts @@ -0,0 +1,21 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const popover = (skin: Skin): Theme['components'] => ({ + MuiPopover: { + styleOverrides: { + paper: { + ...(skin === 'bordered' + ? { boxShadow: 'none', border: '1px solid var(--mui-palette-divider)' } + : { + boxShadow: 'var(--mui-customShadows-sm)' + }) + } + } + } +}) + +export default popover diff --git a/src/@core/theme/overrides/progress.ts b/src/@core/theme/overrides/progress.ts new file mode 100644 index 0000000..0db64ef --- /dev/null +++ b/src/@core/theme/overrides/progress.ts @@ -0,0 +1,22 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const progress: Theme['components'] = { + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + blockSize: 6, + borderRadius: 'var(--mui-shape-borderRadius)', + backgroundColor: 'var(--mui-palette-customColors-trackBg)', + '& .MuiLinearProgress-bar': { + borderRadius: 'var(--mui-shape-borderRadius)' + }, + '& .MuiLinearProgress-dashed': { + marginTop: theme.spacing(0.2) + } + }) + } + } +} + +export default progress diff --git a/src/@core/theme/overrides/radio.tsx b/src/@core/theme/overrides/radio.tsx new file mode 100644 index 0000000..5438886 --- /dev/null +++ b/src/@core/theme/overrides/radio.tsx @@ -0,0 +1,84 @@ +// React Imports +import React from 'react' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const IconChecked = () => { + return ( + + + + ) +} + +const UncheckedIcon = () => { + return ( + + + + ) +} + +const radio: Theme['components'] = { + MuiRadio: { + defaultProps: { + icon: , + checkedIcon: + }, + styleOverrides: { + root: ({ theme, ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + padding: theme.spacing(1), + '& svg': { + fontSize: '1.25rem' + } + } + : { + padding: theme.spacing(1.5), + '& svg': { + fontSize: '1.5rem' + } + }), + '&:not(.Mui-checked):not(.Mui-disabled) svg, &:not(.Mui-checked):not(.Mui-disabled) i': { + color: 'var(--mui-palette-text-disabled)' + }, + '&.Mui-checked:not(.Mui-disabled) svg': { + filter: `drop-shadow(var(--mui-customShadows-${ownerState.color}-sm))` + }, + '&.Mui-disabled': { + opacity: 0.45, + '&:not(.Mui-checked)': { + color: 'var(--mui-palette-text-secondary)' + }, + '&.Mui-checked.MuiRadio-colorPrimary': { + color: 'var(--mui-palette-primary-main)' + }, + '&.Mui-checked.MuiRadio-colorSecondary': { + color: 'var(--mui-palette-secondary-main)' + }, + '&.Mui-checked.MuiRadio-colorError': { + color: 'var(--mui-palette-error-main)' + }, + '&.Mui-checked.MuiRadio-colorWarning': { + color: 'var(--mui-palette-warning-main)' + }, + '&.Mui-checked.MuiRadio-colorInfo': { + color: 'var(--mui-palette-info-main)' + }, + '&.Mui-checked.MuiRadio-colorSuccess': { + color: 'var(--mui-palette-success-main)' + } + } + }) + } + } +} + +export default radio diff --git a/src/@core/theme/overrides/rating.tsx b/src/@core/theme/overrides/rating.tsx new file mode 100644 index 0000000..2dba81c --- /dev/null +++ b/src/@core/theme/overrides/rating.tsx @@ -0,0 +1,35 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const rating: Theme['components'] = { + MuiRating: { + defaultProps: { + emptyIcon: , + icon: + }, + styleOverrides: { + root: { + gap: '2px', + color: 'var(--mui-palette-warning-main)', + '& i, & svg': { + flexShrink: 0 + }, + '& .MuiRating-decimal > label:first-of-type, & .MuiRating-decimal > span:first-of-type': { + zIndex: 1 + } + }, + sizeSmall: { + '& .MuiRating-icon i, & .MuiRating-icon svg': { + fontSize: '1.25rem' + } + }, + sizeLarge: { + '& .MuiRating-icon i, & .MuiRating-icon svg': { + fontSize: '1.75rem' + } + } + } + } +} + +export default rating diff --git a/src/@core/theme/overrides/select.tsx b/src/@core/theme/overrides/select.tsx new file mode 100644 index 0000000..90ae028 --- /dev/null +++ b/src/@core/theme/overrides/select.tsx @@ -0,0 +1,60 @@ +// React Imports +import React from 'react' + +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const SelectIcon = () => { + return +} + +const iconStyles = (theme: Theme) => ({ + userSelect: 'none', + display: 'inline-block', + fill: 'currentColor', + flexShrink: 0, + transition: theme.transitions.create('fill', { + duration: theme.transitions.duration.shorter + }), + fontSize: '1.25rem', + position: 'absolute', + right: '1rem', + pointerEvents: 'none' +}) + +const select: Theme['components'] = { + MuiSelect: { + defaultProps: { + IconComponent: SelectIcon + }, + styleOverrides: { + select: ({ theme, ownerState }) => ({ + ...(ownerState.variant === 'outlined' && { + height: '1.5em' + }), + '&[aria-expanded="true"] ~ i, &[aria-expanded="true"] ~ svg': { + transform: 'rotate(180deg)' + }, + '& ~ i, & ~ svg': iconStyles(theme as Theme), + '&.MuiInputBase-inputSizeSmall': { + '& ~ i, & ~ svg': { + height: '1.125rem', + width: '1.125rem' + } + }, + '&:not(aria-label="Without label") ~ .MuiOutlinedInput-notchedOutline > legend > span': { + paddingInline: '5px' + } + }) + } + }, + MuiNativeSelect: { + styleOverrides: { + select: ({ theme }) => ({ + '& + i, & + svg': iconStyles(theme as Theme) + }) + } + } +} + +export default select diff --git a/src/@core/theme/overrides/slider.ts b/src/@core/theme/overrides/slider.ts new file mode 100644 index 0000000..5cb88cc --- /dev/null +++ b/src/@core/theme/overrides/slider.ts @@ -0,0 +1,100 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const slider: Theme['components'] = { + MuiSlider: { + styleOverrides: { + root: ({ ownerState }) => ({ + boxSizing: 'border-box', + ...(ownerState.orientation === 'horizontal' + ? ownerState.size !== 'small' + ? { blockSize: 6 } + : { blockSize: 4 } + : ownerState.size !== 'small' + ? { inlineSize: 6 } + : { inlineSize: 4 }), + '&.Mui-disabled': { + opacity: 0.45, + color: `var(--mui-palette-${ownerState.color}-main)` + } + }), + thumb: ({ ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + blockSize: 14, + inlineSize: 14, + border: '2px solid currentColor', + '&:hover, &.Mui-focusVisible': { + boxShadow: `0 0 0 7px var(--mui-palette-${ownerState.color}-lightOpacity)` + }, + '&.Mui-active.Mui-focusVisible': { + boxShadow: `0 0 0 10px var(--mui-palette-${ownerState.color}-lightOpacity)` + } + } + : { + blockSize: 22, + inlineSize: 22, + border: '4px solid currentColor' + }), + backgroundColor: 'var(--mui-palette-common-white)', + ...(!ownerState.disabled && { + boxShadow: 'var(--mui-customShadows-sm)' + }), + '&:before': { + boxShadow: 'none' + }, + '&:after': { + ...(ownerState.size === 'small' + ? { + blockSize: 28, + inlineSize: 28 + } + : { + blockSize: 38, + inlineSize: 38 + }) + }, + '&:hover, &.Mui-focusVisible': { + boxShadow: `0 0 0 8px var(--mui-palette-${ownerState.color}-lightOpacity)` + }, + '&.Mui-active.Mui-focusVisible': { + boxShadow: `0 0 0 13px var(--mui-palette-${ownerState.color}-lightOpacity)` + } + }), + rail: ({ ownerState }) => ({ + opacity: 1, + color: `var(--mui-palette-${ownerState.color}-lightOpacity)`, + ...(ownerState.track === 'inverted' && { + backgroundColor: `var(--mui-palette-${ownerState.color}-main)` + }) + }), + valueLabel: ({ theme, ownerState }) => ({ + ...(ownerState.size === 'small' + ? { + ...theme.typography.caption, + padding: theme.spacing(0.5, 2), + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + } + : { + ...theme.typography.body2, + fontWeight: theme.typography.fontWeightMedium, + padding: theme.spacing(0.5, 2.5), + borderRadius: 'var(--mui-shape-borderRadius)' + }), + color: 'var(--mui-palette-customColors-tooltipText)', + backgroundColor: 'var(--mui-palette-Tooltip-bg)', + '&:before': { + display: 'none' + } + }), + track: ({ theme, ownerState }) => ({ + ...(ownerState.track === 'inverted' && { + backgroundColor: `color-mix(in srgb, ${theme.palette[ownerState.color || 'primary'].main} 16%, var(--mui-palette-background-paper))`, + borderColor: `color-mix(in srgb, ${theme.palette[ownerState.color || 'primary'].main} 16%, var(--mui-palette-background-paper))` + }) + }) + } + } +} + +export default slider diff --git a/src/@core/theme/overrides/snackbar.ts b/src/@core/theme/overrides/snackbar.ts new file mode 100644 index 0000000..6ac0481 --- /dev/null +++ b/src/@core/theme/overrides/snackbar.ts @@ -0,0 +1,27 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { Skin } from '@core/types' + +const snackbar = (skin: Skin): Theme['components'] => ({ + MuiSnackbarContent: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(0, 4), + ...(skin !== 'bordered' + ? { + boxShadow: 'var(--mui-customShadows-xs)' + } + : { + boxShadow: 'none' + }), + '& .MuiSnackbarContent-message': { + paddingBlock: theme.spacing(3) + } + }) + } + } +}) + +export default snackbar diff --git a/src/@core/theme/overrides/switch.ts b/src/@core/theme/overrides/switch.ts new file mode 100644 index 0000000..8415079 --- /dev/null +++ b/src/@core/theme/overrides/switch.ts @@ -0,0 +1,74 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const switchOverrides: Theme['components'] = { + MuiSwitch: { + defaultProps: { + disableRipple: true + }, + styleOverrides: { + root: ({ theme, ownerState }) => ({ + '&:has(.Mui-disabled)': { + opacity: 0.45 + }, + ...(ownerState.size !== 'small' + ? { + width: 46, + height: 36, + padding: theme.spacing(2.25, 2) + } + : { + width: 42, + height: 30, + padding: theme.spacing(1.75, 2), + '& .MuiSwitch-thumb': { + width: 12, + height: 12 + }, + '& .MuiSwitch-switchBase': { + padding: 7, + left: 3, + '&.Mui-checked': { + left: -3 + } + } + }) + }), + switchBase: ({ ownerState }) => ({ + top: 2, + left: 1, + '&.Mui-checked': { + left: -7, + color: 'var(--mui-palette-common-white)', + '& + .MuiSwitch-track': { + opacity: 1 + } + }, + '&.Mui-checked:not(.Mui-disabled) + .MuiSwitch-track': { + boxShadow: `var(--mui-customShadows-${ownerState.color}-sm)` + }, + '&:not(.Mui-checked) + .MuiSwitch-track': { + boxShadow: '0 0 4px rgb(0 0 0 / 0.16) inset' + }, + '&.Mui-disabled + .MuiSwitch-track': { + opacity: 1 + }, + '&:hover:not(:has(span.MuiTouchRipple-root))': { + backgroundColor: 'transparent' + } + }), + thumb: { + width: 14, + height: 14, + boxShadow: 'var(--mui-customShadows-xs)' + }, + track: { + opacity: 1, + borderRadius: 10, + backgroundColor: 'var(--mui-palette-action-focus)' + } + } + } +} + +export default switchOverrides diff --git a/src/@core/theme/overrides/table-pagination.ts b/src/@core/theme/overrides/table-pagination.ts new file mode 100644 index 0000000..9ad046f --- /dev/null +++ b/src/@core/theme/overrides/table-pagination.ts @@ -0,0 +1,19 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const tablePagination: Theme['components'] = { + MuiTablePagination: { + styleOverrides: { + toolbar: ({ theme }) => ({ + paddingInlineEnd: `${theme.spacing(3)} !important` + }), + select: { + '& ~ i, & ~ svg': { + right: '2px !important' + } + } + } + } +} + +export default tablePagination diff --git a/src/@core/theme/overrides/tabs.ts b/src/@core/theme/overrides/tabs.ts new file mode 100644 index 0000000..60978f1 --- /dev/null +++ b/src/@core/theme/overrides/tabs.ts @@ -0,0 +1,101 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const tabs: Theme['components'] = { + MuiTabs: { + styleOverrides: { + root: ({ theme, ownerState }) => ({ + minBlockSize: 38, + ...(ownerState.orientation === 'horizontal' + ? { + borderBlockEnd: '1px solid var(--mui-palette-divider)' + } + : { + borderInlineEnd: '1px solid var(--mui-palette-divider)' + }), + '& .MuiTab-root:hover': { + ...(ownerState.orientation === 'horizontal' + ? { + paddingBlockEnd: theme.spacing(1.5), + ...(ownerState.textColor === 'secondary' + ? { + color: 'var(--mui-palette-secondary-main)', + borderBlockEnd: '2px solid var(--mui-palette-secondary-lightOpacity)' + } + : { + color: 'var(--mui-palette-primary-main)', + borderBlockEnd: '2px solid var(--mui-palette-primary-lightOpacity)' + }) + } + : { + paddingInlineEnd: theme.spacing(4.5), + ...(ownerState.textColor === 'secondary' + ? { + color: 'var(--mui-palette-secondary-main)', + borderInlineEnd: '2px solid var(--mui-palette-secondary-mainOpacity)' + } + : { + color: 'var(--mui-palette-primary-main)', + borderInlineEnd: '2px solid var(--mui-palette-primary-mainOpacity)' + }) + }), + '& .MuiTabScrollButton-root': { + borderRadius: 'var(--mui-shape-borderRadius)' + } + }, + '& ~ .MuiTabPanel-root': { + ...(ownerState.orientation === 'horizontal' + ? { + paddingBlockStart: theme.spacing(6) + } + : { + paddingInlineStart: theme.spacing(6) + }) + } + }), + vertical: { + minWidth: 131, + '& .MuiTab-root': { + minWidth: 130 + } + } + } + }, + MuiTab: { + defaultProps: { + disableRipple: true + }, + styleOverrides: { + root: ({ theme, ownerState }) => ({ + lineHeight: 1.4667, + padding: theme.spacing(2, 5), + minBlockSize: 38, + color: 'var(--mui-palette-text-primary)', + '& > .MuiTab-icon': { + fontSize: '1.125rem', + ...(ownerState.iconPosition === 'top' && { + marginBlockEnd: theme.spacing(1.5) + }), + ...(ownerState.iconPosition === 'bottom' && { + marginBlockStart: theme.spacing(1.5) + }), + ...(ownerState.iconPosition === 'start' && { + marginInlineEnd: theme.spacing(1.5) + }), + ...(ownerState.iconPosition === 'end' && { + marginInlineStart: theme.spacing(1.5) + }) + } + }) + } + }, + MuiTabPanel: { + styleOverrides: { + root: { + padding: 0 + } + } + } +} + +export default tabs diff --git a/src/@core/theme/overrides/timeline.ts b/src/@core/theme/overrides/timeline.ts new file mode 100644 index 0000000..90b5031 --- /dev/null +++ b/src/@core/theme/overrides/timeline.ts @@ -0,0 +1,164 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const timeline: Theme['components'] = { + MuiTimeline: { + styleOverrides: { + root: { + padding: 0 + } + } + }, + MuiTimelineDot: { + styleOverrides: { + root: ({ theme }) => ({ + margin: theme.spacing(3, 0), + boxShadow: 'none', + '&:has(> i), &:has(> svg)': { + padding: 6 + }, + '& > svg, & > i': { + fontSize: '1.25rem' + }, + '&:has(svg)': { + width: 32, + height: 32, + alignItems: 'center', + justifyContent: 'center' + }, + variants: [ + { + props: { variant: 'outlined' }, + style: { + padding: 5, + '& + .MuiTimelineConnector-root': { + backgroundColor: 'transparent', + borderInlineStart: '1px dashed var(--mui-palette-divider)' + }, + '&:has(+ .MuiTimelineConnector-root)': { + marginBlock: '0.625rem' + } + } + }, + { + props: { variant: 'filled', color: 'grey' }, + style: { + boxShadow: '0 0 0 3px rgb(var(--mui-palette-action-activeChannel) / 0.04)' + } + }, + { + props: { variant: 'filled', color: 'primary' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-primary-lightOpacity)' + } + }, + { + props: { variant: 'filled', color: 'secondary' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-secondary-lightOpacity)' + } + }, + { + props: { variant: 'filled', color: 'error' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-error-lightOpacity)' + } + }, + { + props: { variant: 'filled', color: 'warning' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-warning-lightOpacity)' + } + }, + { + props: { variant: 'filled', color: 'info' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-info-lightOpacity)' + } + }, + { + props: { variant: 'filled', color: 'success' }, + style: { + boxShadow: '0 0 0 3px var(--mui-palette-success-lightOpacity)' + } + }, + { + props: { variant: 'tonal' }, + style: { + border: 0, + '&:has(+ .MuiTimelineConnector-root)': { + marginBlock: '1rem' + } + } + }, + { + props: { variant: 'tonal', color: 'grey' }, + style: { + backgroundColor: 'var(--mui-palette-action-selected)', + color: 'var(--mui-palette-text-primary)' + } + }, + { + props: { variant: 'tonal', color: 'primary' }, + style: { + backgroundColor: 'var(--mui-palette-primary-lightOpacity)', + color: 'var(--mui-palette-primary-main)' + } + }, + { + props: { variant: 'tonal', color: 'secondary' }, + style: { + backgroundColor: 'var(--mui-palette-secondary-lightOpacity)', + color: 'var(--mui-palette-secondary-main)' + } + }, + { + props: { variant: 'tonal', color: 'error' }, + style: { + backgroundColor: 'var(--mui-palette-error-lightOpacity)', + color: 'var(--mui-palette-error-main)' + } + }, + { + props: { variant: 'tonal', color: 'warning' }, + style: { + backgroundColor: 'var(--mui-palette-warning-lightOpacity)', + color: 'var(--mui-palette-warning-main)' + } + }, + { + props: { variant: 'tonal', color: 'info' }, + style: { + backgroundColor: 'var(--mui-palette-info-lightOpacity)', + color: 'var(--mui-palette-info-main)' + } + }, + { + props: { variant: 'tonal', color: 'success' }, + style: { + backgroundColor: 'var(--mui-palette-success-lightOpacity)', + color: 'var(--mui-palette-success-main)' + } + } + ] + }) + } + }, + MuiTimelineConnector: { + styleOverrides: { + root: { + width: 1, + backgroundColor: 'var(--mui-palette-divider)' + } + } + }, + MuiTimelineContent: { + styleOverrides: { + root: { + paddingBottom: '1rem' + } + } + } +} + +export default timeline diff --git a/src/@core/theme/overrides/toggle-button.ts b/src/@core/theme/overrides/toggle-button.ts new file mode 100644 index 0000000..1d49d2f --- /dev/null +++ b/src/@core/theme/overrides/toggle-button.ts @@ -0,0 +1,34 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const toggleButton: Theme['components'] = { + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ ownerState }) => ({ + ...(ownerState.size === 'small' && { + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + }), + ...(ownerState.size === 'large' && { + borderRadius: 'var(--mui-shape-customBorderRadius-lg)' + }) + }) + } + }, + MuiToggleButton: { + styleOverrides: { + root: { + '&:not(.Mui-selected):not(.Mui-disabled)': { + color: 'var(--mui-palette-text-secondary)' + } + }, + sizeSmall: { + borderRadius: 'var(--mui-shape-customBorderRadius-sm)' + }, + sizeLarge: { + borderRadius: 'var(--mui-shape-customBorderRadius-lg)' + } + } + } +} + +export default toggleButton diff --git a/src/@core/theme/overrides/tooltip.ts b/src/@core/theme/overrides/tooltip.ts new file mode 100644 index 0000000..3d8b7af --- /dev/null +++ b/src/@core/theme/overrides/tooltip.ts @@ -0,0 +1,33 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const tooltip: Theme['components'] = { + MuiTooltip: { + styleOverrides: { + tooltip: ({ theme }) => ({ + borderRadius: 'var(--mui-shape-customBorderRadius-sm)', + fontSize: theme.typography.subtitle2.fontSize, + lineHeight: 1.539, + color: 'var(--mui-palette-customColors-tooltipText)', + paddingInline: theme.spacing(3), + paddingBlock: 5 + }), + popper: { + '&[data-popper-placement*="bottom"] .MuiTooltip-tooltip': { + marginTop: '6px !important' + }, + '&[data-popper-placement*="top"] .MuiTooltip-tooltip': { + marginBottom: '6px !important' + }, + '&[data-popper-placement*="left"] .MuiTooltip-tooltip': { + marginRight: '6px !important' + }, + '&[data-popper-placement*="right"] .MuiTooltip-tooltip': { + marginLeft: '6px !important' + } + } + } + } +} + +export default tooltip diff --git a/src/@core/theme/overrides/typography.ts b/src/@core/theme/overrides/typography.ts new file mode 100644 index 0000000..0609a22 --- /dev/null +++ b/src/@core/theme/overrides/typography.ts @@ -0,0 +1,70 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const typography: Theme['components'] = { + MuiTypography: { + styleOverrides: { + root: { + variants: [ + { + props: { variant: 'h1' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'h2' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'h3' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'h4' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'h5' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'h6' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'subtitle1' }, + style: { color: 'rgb(var(--mui-palette-text-primaryChannel) / 0.55)' } + }, + { + props: { variant: 'subtitle2' }, + style: { color: 'rgb(var(--mui-palette-text-primaryChannel) / 0.55)' } + }, + { + props: { variant: 'body1' }, + style: { color: 'var(--mui-palette-text-secondary)' } + }, + { + props: { variant: 'body2' }, + style: { color: 'var(--mui-palette-text-secondary)' } + }, + { + props: { variant: 'button' }, + style: { color: 'var(--mui-palette-text-primary)' } + }, + { + props: { variant: 'caption' }, + style: { color: 'var(--mui-palette-text-disabled)' } + }, + { + props: { variant: 'overline' }, + style: { color: 'var(--mui-palette-text-primary)' } + } + ] + }, + gutterBottom: ({ theme }) => ({ + marginBottom: theme.spacing(2) + }) + } + } +} + +export default typography diff --git a/src/@core/theme/shadows.ts b/src/@core/theme/shadows.ts new file mode 100644 index 0000000..9a8f785 --- /dev/null +++ b/src/@core/theme/shadows.ts @@ -0,0 +1,39 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Type Imports +import type { SystemMode } from '@core/types' + +const shadows = (mode: SystemMode): Theme['shadows'] => { + const color = `var(--mui-mainColorChannels-${mode}Shadow)` + + return [ + 'none', + `0px 2px 1px -1px rgb(${color} / 0.2),0px 1px 1px 0px rgb(${color} / 0.14),0px 1px 3px 0px rgb(${color} / 0.12)`, + `0px 3px 1px -2px rgb(${color} / 0.2),0px 2px 2px 0px rgb(${color} / 0.14),0px 1px 5px 0px rgb(${color} / 0.12)`, + `0px 3px 3px -2px rgb(${color} / 0.2),0px 3px 4px 0px rgb(${color} / 0.14),0px 1px 8px 0px rgb(${color} / 0.12)`, + `0px 2px 4px -1px rgb(${color} / 0.2),0px 4px 5px 0px rgb(${color} / 0.14),0px 1px 10px 0px rgb(${color} / 0.12)`, + `0px 3px 5px -1px rgb(${color} / 0.2),0px 5px 8px 0px rgb(${color} / 0.14),0px 1px 14px 0px rgb(${color} / 0.12)`, + `0px 3px 5px -1px rgb(${color} / 0.2),0px 6px 10px 0px rgb(${color} / 0.14),0px 1px 18px 0px rgb(${color} / 0.12)`, + `0px 4px 5px -2px rgb(${color} / 0.2),0px 7px 10px 1px rgb(${color} / 0.14),0px 2px 16px 1px rgb(${color} / 0.12)`, + `0px 5px 5px -3px rgb(${color} / 0.2),0px 8px 10px 1px rgb(${color} / 0.14),0px 3px 14px 2px rgb(${color} / 0.12)`, + `0px 5px 6px -3px rgb(${color} / 0.2),0px 9px 12px 1px rgb(${color} / 0.14),0px 3px 16px 2px rgb(${color} / 0.12)`, + `0px 6px 6px -3px rgb(${color} / 0.2),0px 10px 14px 1px rgb(${color} / 0.14),0px 4px 18px 3px rgb(${color} / 0.12)`, + `0px 6px 7px -4px rgb(${color} / 0.2),0px 11px 15px 1px rgb(${color} / 0.14),0px 4px 20px 3px rgb(${color} / 0.12)`, + `0px 7px 8px -4px rgb(${color} / 0.2),0px 12px 17px 2px rgb(${color} / 0.14),0px 5px 22px 4px rgb(${color} / 0.12)`, + `0px 7px 8px -4px rgb(${color} / 0.2),0px 13px 19px 2px rgb(${color} / 0.14),0px 5px 24px 4px rgb(${color} / 0.12)`, + `0px 7px 9px -4px rgb(${color} / 0.2),0px 14px 21px 2px rgb(${color} / 0.14),0px 5px 26px 4px rgb(${color} / 0.12)`, + `0px 8px 9px -5px rgb(${color} / 0.2),0px 15px 22px 2px rgb(${color} / 0.14),0px 6px 28px 5px rgb(${color} / 0.12)`, + `0px 8px 10px -5px rgb(${color} / 0.2),0px 16px 24px 2px rgb(${color} / 0.14),0px 6px 30px 5px rgb(${color} / 0.12)`, + `0px 8px 11px -5px rgb(${color} / 0.2),0px 17px 26px 2px rgb(${color} / 0.14),0px 6px 32px 5px rgb(${color} / 0.12)`, + `0px 9px 11px -5px rgb(${color} / 0.2),0px 18px 28px 2px rgb(${color} / 0.14),0px 7px 34px 6px rgb(${color} / 0.12)`, + `0px 9px 12px -6px rgb(${color} / 0.2),0px 19px 29px 2px rgb(${color} / 0.14),0px 7px 36px 6px rgb(${color} / 0.12)`, + `0px 10px 13px -6px rgb(${color} / 0.2),0px 20px 31px 3px rgb(${color} / 0.14),0px 8px 38px 7px rgb(${color} / 0.12)`, + `0px 10px 13px -6px rgb(${color} / 0.2),0px 21px 33px 3px rgb(${color} / 0.14),0px 8px 40px 7px rgb(${color} / 0.12)`, + `0px 10px 14px -6px rgb(${color} / 0.2),0px 22px 35px 3px rgb(${color} / 0.14),0px 8px 42px 7px rgb(${color} / 0.12)`, + `0px 11px 14px -7px rgb(${color} / 0.2),0px 23px 36px 3px rgb(${color} / 0.14),0px 9px 44px 8px rgb(${color} / 0.12)`, + `0px 11px 15px -7px rgb(${color} / 0.2),0px 24px 38px 3px rgb(${color} / 0.14),0px 9px 46px 8px rgb(${color} / 0.12)` + ] +} + +export default shadows diff --git a/src/@core/theme/spacing.ts b/src/@core/theme/spacing.ts new file mode 100644 index 0000000..c40a168 --- /dev/null +++ b/src/@core/theme/spacing.ts @@ -0,0 +1,5 @@ +const spacing = { + spacing: (factor: number) => `${0.25 * factor}rem` +} + +export default spacing diff --git a/src/@core/theme/typography.ts b/src/@core/theme/typography.ts new file mode 100644 index 0000000..eb01887 --- /dev/null +++ b/src/@core/theme/typography.ts @@ -0,0 +1,88 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +const typography = (fontFamily: string): Theme['typography'] => + ({ + fontFamily: + typeof fontFamily === 'undefined' || fontFamily === '' + ? [ + '"Public Sans"', + 'sans-serif', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"' + ].join(',') + : fontFamily, + fontSize: 13.125, + h1: { + fontSize: '2.875rem', + fontWeight: 500, + lineHeight: 1.47826 + }, + h2: { + fontSize: '2.375rem', + fontWeight: 500, + lineHeight: 1.47368421 + }, + h3: { + fontSize: '1.75rem', + fontWeight: 500, + lineHeight: 1.5 + }, + h4: { + fontSize: '1.5rem', + fontWeight: 500, + lineHeight: 1.58334 + }, + h5: { + fontSize: '1.125rem', + fontWeight: 500, + lineHeight: 1.5556 + }, + h6: { + fontSize: '0.9375rem', + fontWeight: 500, + lineHeight: 1.46667 + }, + subtitle1: { + fontSize: '0.9375rem', + lineHeight: 1.46667 + }, + subtitle2: { + fontSize: '0.8125rem', + fontWeight: 400, + lineHeight: 1.53846154 + }, + body1: { + fontSize: '0.9375rem', + lineHeight: 1.46667 + }, + body2: { + fontSize: '0.8125rem', + lineHeight: 1.53846154 + }, + button: { + fontSize: '0.9375rem', + lineHeight: 1.46667, + textTransform: 'none' + }, + caption: { + fontSize: '0.8125rem', + lineHeight: 1.38462, + letterSpacing: '0.4px' + }, + overline: { + fontSize: '0.75rem', + lineHeight: 1.16667, + letterSpacing: '0.8px' + } + }) as Theme['typography'] + +export default typography diff --git a/src/@core/types.ts b/src/@core/types.ts new file mode 100644 index 0000000..b8db2ce --- /dev/null +++ b/src/@core/types.ts @@ -0,0 +1,22 @@ +// React Imports +import type { ReactNode } from 'react' + +export type Layout = 'vertical' | 'collapsed' | 'horizontal' + +export type Skin = 'default' | 'bordered' + +export type Mode = 'system' | 'light' | 'dark' + +export type SystemMode = 'light' | 'dark' + +export type Direction = 'ltr' | 'rtl' + +export type LayoutComponentWidth = 'compact' | 'wide' + +export type LayoutComponentPosition = 'fixed' | 'static' + +export type ChildrenType = { + children: ReactNode +} + +export type ThemeColor = 'primary' | 'secondary' | 'error' | 'warning' | 'info' | 'success' diff --git a/src/@core/utils/serverHelpers.ts b/src/@core/utils/serverHelpers.ts new file mode 100644 index 0000000..a3febd9 --- /dev/null +++ b/src/@core/utils/serverHelpers.ts @@ -0,0 +1,48 @@ +// Next Imports +import { cookies } from 'next/headers' + +// Type Imports +import type { Settings } from '@core/contexts/settingsContext' +import type { SystemMode } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +export const getSettingsFromCookie = async (): Promise => { + const cookieStore = await cookies() + + const cookieName = themeConfig.settingsCookieName + + return JSON.parse(cookieStore.get(cookieName)?.value || '{}') +} + +export const getMode = async () => { + const settingsCookie = await getSettingsFromCookie() + + // Get mode from cookie or fallback to theme config + const _mode = settingsCookie.mode || themeConfig.mode + + return _mode +} + +export const getSystemMode = async (): Promise => { + const cookieStore = await cookies() + const mode = await getMode() + + const colorPrefCookie = (cookieStore.get('colorPref')?.value || 'light') as SystemMode + + return (mode === 'system' ? colorPrefCookie : mode) || 'light' +} + +export const getServerMode = async () => { + const mode = await getMode() + const systemMode = await getSystemMode() + + return mode === 'system' ? systemMode : mode +} + +export const getSkin = async () => { + const settingsCookie = await getSettingsFromCookie() + + return settingsCookie.skin || 'default' +} diff --git a/src/@layouts/BlankLayout.tsx b/src/@layouts/BlankLayout.tsx new file mode 100644 index 0000000..4b62cc2 --- /dev/null +++ b/src/@layouts/BlankLayout.tsx @@ -0,0 +1,36 @@ +'use client' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType, SystemMode } from '@core/types' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' +import useLayoutInit from '@core/hooks/useLayoutInit' + +// Util Imports +import { blankLayoutClasses } from './utils/layoutClasses' + +type Props = ChildrenType & { + systemMode: SystemMode +} + +const BlankLayout = (props: Props) => { + // Props + const { children, systemMode } = props + + // Hooks + const { settings } = useSettings() + + useLayoutInit(systemMode) + + return ( +
+ {children} +
+ ) +} + +export default BlankLayout diff --git a/src/@layouts/HorizontalLayout.tsx b/src/@layouts/HorizontalLayout.tsx new file mode 100644 index 0000000..d7c03b5 --- /dev/null +++ b/src/@layouts/HorizontalLayout.tsx @@ -0,0 +1,44 @@ +// React Imports +import type { ReactNode } from 'react' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Context Imports +import { HorizontalNavProvider } from '@menu/contexts/horizontalNavContext' + +// Component Imports +import LayoutContent from './components/horizontal/LayoutContent' + +// Util Imports +import { horizontalLayoutClasses } from './utils/layoutClasses' + +// Styled Component Imports +import StyledContentWrapper from './styles/horizontal/StyledContentWrapper' + +type HorizontalLayoutProps = ChildrenType & { + header?: ReactNode + footer?: ReactNode +} + +const HorizontalLayout = (props: HorizontalLayoutProps) => { + // Props + const { header, footer, children } = props + + return ( +
+ + + {header || null} + {children} + {footer || null} + + +
+ ) +} + +export default HorizontalLayout diff --git a/src/@layouts/LayoutWrapper.tsx b/src/@layouts/LayoutWrapper.tsx new file mode 100644 index 0000000..9e60a3f --- /dev/null +++ b/src/@layouts/LayoutWrapper.tsx @@ -0,0 +1,36 @@ +'use client' + +// React Imports +import type { ReactElement } from 'react' + +// Type Imports +import type { SystemMode } from '@core/types' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' +import useLayoutInit from '@core/hooks/useLayoutInit' + +type LayoutWrapperProps = { + systemMode: SystemMode + verticalLayout: ReactElement + horizontalLayout: ReactElement +} + +const LayoutWrapper = (props: LayoutWrapperProps) => { + // Props + const { systemMode, verticalLayout, horizontalLayout } = props + + // Hooks + const { settings } = useSettings() + + useLayoutInit(systemMode) + + // Return the layout based on the layout context + return ( +
+ {settings.layout === 'horizontal' ? horizontalLayout : verticalLayout} +
+ ) +} + +export default LayoutWrapper diff --git a/src/@layouts/VerticalLayout.tsx b/src/@layouts/VerticalLayout.tsx new file mode 100644 index 0000000..cdc6dea --- /dev/null +++ b/src/@layouts/VerticalLayout.tsx @@ -0,0 +1,44 @@ +// React Imports +import type { ReactNode } from 'react' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Component Imports +import LayoutContent from './components/vertical/LayoutContent' + +// Util Imports +import { verticalLayoutClasses } from './utils/layoutClasses' + +// Styled Component Imports +import StyledContentWrapper from './styles/vertical/StyledContentWrapper' + +type VerticalLayoutProps = ChildrenType & { + navigation?: ReactNode + navbar?: ReactNode + footer?: ReactNode +} + +const VerticalLayout = (props: VerticalLayoutProps) => { + // Props + const { navbar, footer, navigation, children } = props + + return ( +
+ {navigation || null} + + {navbar || null} + {/* Content */} + {children} + {footer || null} + +
+ ) +} + +export default VerticalLayout diff --git a/src/@layouts/components/horizontal/Footer.tsx b/src/@layouts/components/horizontal/Footer.tsx new file mode 100644 index 0000000..74d7adc --- /dev/null +++ b/src/@layouts/components/horizontal/Footer.tsx @@ -0,0 +1,56 @@ +'use client' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledFooter from '@layouts/styles/horizontal/StyledFooter' + +type Props = ChildrenType & { + overrideStyles?: CSSObject +} + +const Footer = (props: Props) => { + // Props + const { children, overrideStyles } = props + + // Hooks + const { settings } = useSettings() + + // Vars + const { footerContentWidth } = settings + + const footerStatic = themeConfig.footer.type === 'static' + const footerFixed = themeConfig.footer.type === 'fixed' + const footerContentCompact = footerContentWidth === 'compact' + const footerContentWide = footerContentWidth === 'wide' + + return ( + +
{children}
+
+ ) +} + +export default Footer diff --git a/src/@layouts/components/horizontal/Header.tsx b/src/@layouts/components/horizontal/Header.tsx new file mode 100644 index 0000000..5a338f6 --- /dev/null +++ b/src/@layouts/components/horizontal/Header.tsx @@ -0,0 +1,63 @@ +'use client' + +// MUI Imports +import { useTheme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledHeader from '@layouts/styles/horizontal/StyledHeader' + +type Props = ChildrenType & { + overrideStyles?: CSSObject +} + +const Header = (props: Props) => { + // Props + const { children, overrideStyles } = props + + // Hooks + const { settings } = useSettings() + const theme = useTheme() + + // Vars + const { navbarContentWidth } = settings + + const headerFixed = themeConfig.navbar.type === 'fixed' + const headerStatic = themeConfig.navbar.type === 'static' + const headerBlur = themeConfig.navbar.blur === true + const headerContentCompact = navbarContentWidth === 'compact' + const headerContentWide = navbarContentWidth === 'wide' + + return ( + + {children} + + ) +} + +export default Header diff --git a/src/@layouts/components/horizontal/LayoutContent.tsx b/src/@layouts/components/horizontal/LayoutContent.tsx new file mode 100644 index 0000000..95d060d --- /dev/null +++ b/src/@layouts/components/horizontal/LayoutContent.tsx @@ -0,0 +1,43 @@ +'use client' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledMain from '@layouts/styles/shared/StyledMain' + +const LayoutContent = ({ children }: ChildrenType) => { + // Hooks + const { settings } = useSettings() + + // Vars + const contentCompact = settings.contentWidth === 'compact' + const contentWide = settings.contentWidth === 'wide' + + return ( + + {children} + + ) +} + +export default LayoutContent diff --git a/src/@layouts/components/horizontal/Navbar.tsx b/src/@layouts/components/horizontal/Navbar.tsx new file mode 100644 index 0000000..a679743 --- /dev/null +++ b/src/@layouts/components/horizontal/Navbar.tsx @@ -0,0 +1,18 @@ +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +const Navbar = ({ children }: ChildrenType) => { + return ( +
+ {children} +
+ ) +} + +export default Navbar diff --git a/src/@layouts/components/vertical/Footer.tsx b/src/@layouts/components/vertical/Footer.tsx new file mode 100644 index 0000000..258dcd6 --- /dev/null +++ b/src/@layouts/components/vertical/Footer.tsx @@ -0,0 +1,60 @@ +'use client' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledFooter from '@layouts/styles/vertical/StyledFooter' + +type Props = ChildrenType & { + overrideStyles?: CSSObject +} + +const Footer = (props: Props) => { + // Props + const { children, overrideStyles } = props + + // Hooks + const { settings } = useSettings() + + // Vars + const { footerContentWidth } = settings + + const footerDetached = themeConfig.footer.detached === true + const footerAttached = themeConfig.footer.detached === false + const footerStatic = themeConfig.footer.type === 'static' + const footerFixed = themeConfig.footer.type === 'fixed' + const footerContentCompact = footerContentWidth === 'compact' + const footerContentWide = footerContentWidth === 'wide' + + return ( + +
{children}
+
+ ) +} + +export default Footer diff --git a/src/@layouts/components/vertical/LayoutContent.tsx b/src/@layouts/components/vertical/LayoutContent.tsx new file mode 100644 index 0000000..da0563d --- /dev/null +++ b/src/@layouts/components/vertical/LayoutContent.tsx @@ -0,0 +1,39 @@ +'use client' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledMain from '@layouts/styles/shared/StyledMain' + +const LayoutContent = ({ children }: ChildrenType) => { + // Hooks + const { settings } = useSettings() + + // Vars + const contentCompact = settings.contentWidth === 'compact' + const contentWide = settings.contentWidth === 'wide' + + return ( + + {children} + + ) +} + +export default LayoutContent diff --git a/src/@layouts/components/vertical/Navbar.tsx b/src/@layouts/components/vertical/Navbar.tsx new file mode 100644 index 0000000..f546318 --- /dev/null +++ b/src/@layouts/components/vertical/Navbar.tsx @@ -0,0 +1,76 @@ +'use client' + +// MUI Imports +import { useTheme } from '@mui/material/styles' +import useScrollTrigger from '@mui/material/useScrollTrigger' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styled Component Imports +import StyledHeader from '@layouts/styles/vertical/StyledHeader' + +type Props = ChildrenType & { + overrideStyles?: CSSObject +} + +const Navbar = (props: Props) => { + // Props + const { children, overrideStyles } = props + + // Hooks + const { settings } = useSettings() + const theme = useTheme() + + const trigger = useScrollTrigger({ + threshold: 0, + disableHysteresis: true + }) + + // Vars + const { navbarContentWidth } = settings + + const headerFixed = themeConfig.navbar.type === 'fixed' + const headerStatic = themeConfig.navbar.type === 'static' + const headerFloating = themeConfig.navbar.floating === true + const headerDetached = themeConfig.navbar.detached === true + const headerAttached = themeConfig.navbar.detached === false + const headerBlur = themeConfig.navbar.blur === true + const headerContentCompact = navbarContentWidth === 'compact' + const headerContentWide = navbarContentWidth === 'wide' + + return ( + +
{children}
+
+ ) +} + +export default Navbar diff --git a/src/@layouts/styles/horizontal/StyledContentWrapper.tsx b/src/@layouts/styles/horizontal/StyledContentWrapper.tsx new file mode 100644 index 0000000..d4eb69e --- /dev/null +++ b/src/@layouts/styles/horizontal/StyledContentWrapper.tsx @@ -0,0 +1,15 @@ +'use client' + +// Third-party Imports +import styled from '@emotion/styled' + +// Util Imports +import { commonLayoutClasses, horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +const StyledContentWrapper = styled.div` + &:has(.${horizontalLayoutClasses.content}>.${commonLayoutClasses.contentHeightFixed}) { + max-block-size: 100dvh; + } +` + +export default StyledContentWrapper diff --git a/src/@layouts/styles/horizontal/StyledFooter.tsx b/src/@layouts/styles/horizontal/StyledFooter.tsx new file mode 100644 index 0000000..ed36ef4 --- /dev/null +++ b/src/@layouts/styles/horizontal/StyledFooter.tsx @@ -0,0 +1,44 @@ +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledFooterProps = { + overrideStyles?: CSSObject +} + +const StyledFooter = styled.footer` + &.${horizontalLayoutClasses.footerFixed} { + position: sticky; + inset-block-end: 0; + z-index: var(--footer-z-index); + background-color: var(--mui-palette-background-paper); + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-lightShadow) / 0.14); + [data-mui-color-scheme='dark'] & { + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-darkShadow) / 0.14); + } + [data-skin='bordered'] & { + box-shadow: none; + border-block-start: 1px solid var(--border-color); + } + } + + &.${horizontalLayoutClasses.footerContentCompact} .${horizontalLayoutClasses.footerContentWrapper} { + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + } + + .${horizontalLayoutClasses.footerContentWrapper} { + padding-block: 16px; + padding-inline: ${themeConfig.layoutPadding}px; + } + + ${({ overrideStyles }) => overrideStyles} +` + +export default StyledFooter diff --git a/src/@layouts/styles/horizontal/StyledHeader.tsx b/src/@layouts/styles/horizontal/StyledHeader.tsx new file mode 100644 index 0000000..82a2c0a --- /dev/null +++ b/src/@layouts/styles/horizontal/StyledHeader.tsx @@ -0,0 +1,57 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledHeaderProps = { + theme: Theme + overrideStyles?: CSSObject +} + +const StyledHeader = styled.header` + box-shadow: var(--mui-customShadows-sm); + + [data-skin='bordered'] & { + box-shadow: none; + border-block-end: 1px solid var(--border-color); + } + + &:not(.${horizontalLayoutClasses.headerBlur}) { + background-color: var(--mui-palette-background-paper); + } + + &.${horizontalLayoutClasses.headerBlur} { + backdrop-filter: blur(6px); + background-color: rgb(var(--background-color-rgb) / 0.88); + } + + &.${horizontalLayoutClasses.headerFixed} { + position: sticky; + inset-block-start: 0; + z-index: var(--header-z-index); + } + + &.${horizontalLayoutClasses.headerContentCompact} .${horizontalLayoutClasses.navbar} { + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + } + + .${horizontalLayoutClasses.navbar} { + position: relative; + min-block-size: var(--header-height); + padding-block: 8px; + padding-inline: ${themeConfig.layoutPadding}px; + } + + ${({ overrideStyles }) => overrideStyles} +` + +export default StyledHeader diff --git a/src/@layouts/styles/shared/StyledMain.tsx b/src/@layouts/styles/shared/StyledMain.tsx new file mode 100644 index 0000000..514dbe3 --- /dev/null +++ b/src/@layouts/styles/shared/StyledMain.tsx @@ -0,0 +1,29 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { commonLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledMainProps = { + isContentCompact: boolean +} + +const StyledMain = styled.main` + padding: ${themeConfig.layoutPadding}px; + ${({ isContentCompact }) => + isContentCompact && + ` + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + `} + + &:has(.${commonLayoutClasses.contentHeightFixed}) { + display: flex; + overflow: hidden; + } +` + +export default StyledMain diff --git a/src/@layouts/styles/vertical/StyledContentWrapper.tsx b/src/@layouts/styles/vertical/StyledContentWrapper.tsx new file mode 100644 index 0000000..aa2ed13 --- /dev/null +++ b/src/@layouts/styles/vertical/StyledContentWrapper.tsx @@ -0,0 +1,15 @@ +'use client' + +// Third-party Imports +import styled from '@emotion/styled' + +// Util Imports +import { commonLayoutClasses, verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +const StyledContentWrapper = styled.div` + &:has(.${verticalLayoutClasses.content}>.${commonLayoutClasses.contentHeightFixed}) { + max-block-size: 100dvh; + } +` + +export default StyledContentWrapper diff --git a/src/@layouts/styles/vertical/StyledFooter.tsx b/src/@layouts/styles/vertical/StyledFooter.tsx new file mode 100644 index 0000000..03dd8a4 --- /dev/null +++ b/src/@layouts/styles/vertical/StyledFooter.tsx @@ -0,0 +1,80 @@ +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledFooterProps = { + overrideStyles?: CSSObject +} + +const StyledFooter = styled.footer` + &.${verticalLayoutClasses.footerContentCompact} { + &.${verticalLayoutClasses.footerDetached} { + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + } + + &.${verticalLayoutClasses.footerAttached} .${verticalLayoutClasses.footerContentWrapper} { + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + } + } + + &.${verticalLayoutClasses.footerFixed} { + position: sticky; + inset-block-end: 0; + z-index: var(--footer-z-index); + + &.${verticalLayoutClasses.footerAttached}, + &.${verticalLayoutClasses.footerDetached} + .${verticalLayoutClasses.footerContentWrapper} { + background-color: var(--mui-palette-background-paper); + } + + &.${verticalLayoutClasses.footerDetached} { + pointer-events: none; + padding-inline: ${themeConfig.layoutPadding}px; + + & .${verticalLayoutClasses.footerContentWrapper} { + pointer-events: auto; + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-lightShadow) / 0.14); + [data-mui-color-scheme='dark'] & { + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-darkShadow) / 0.14); + } + border-start-start-radius: var(--border-radius); + border-start-end-radius: var(--border-radius); + + [data-skin='bordered'] & { + box-shadow: none; + border-inline: 1px solid var(--border-color); + border-block-start: 1px solid var(--border-color); + } + } + } + + &.${verticalLayoutClasses.footerAttached} { + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-lightShadow) / 0.14); + [data-mui-color-scheme='dark'] & { + box-shadow: 0 3px 12px 0px rgb(var(--mui-mainColorChannels-darkShadow) / 0.14); + } + [data-skin='bordered'] & { + box-shadow: none; + border-block-start: 1px solid var(--border-color); + } + } + } + + & .${verticalLayoutClasses.footerContentWrapper} { + padding-block: 16px; + padding-inline: ${themeConfig.layoutPadding}px; + } + + ${({ overrideStyles }) => overrideStyles} +` + +export default StyledFooter diff --git a/src/@layouts/styles/vertical/StyledHeader.tsx b/src/@layouts/styles/vertical/StyledHeader.tsx new file mode 100644 index 0000000..5018fe1 --- /dev/null +++ b/src/@layouts/styles/vertical/StyledHeader.tsx @@ -0,0 +1,178 @@ +// MUI Imports +import type { Theme } from '@mui/material/styles' + +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { verticalLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledHeaderProps = { + theme: Theme + overrideStyles?: CSSObject +} + +const StyledHeader = styled.header` + display: flex; + align-items: center; + justify-content: center; + inline-size: 100%; + flex-shrink: 0; + min-block-size: var(--header-height); + + &.${verticalLayoutClasses.headerContentCompact} { + &.${verticalLayoutClasses.headerFloating} + .${verticalLayoutClasses.navbar}, + &.${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar}, + &.${verticalLayoutClasses.headerAttached} + .${verticalLayoutClasses.navbar} { + margin-inline: auto; + } + + &.${verticalLayoutClasses.headerFloating} + .${verticalLayoutClasses.navbar}, + &.${verticalLayoutClasses.headerFixed}.${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar} { + max-inline-size: calc(${themeConfig.compactContentWidth}px - ${2 * themeConfig.layoutPadding}px); + } + + .${verticalLayoutClasses.navbar} { + max-inline-size: ${themeConfig.compactContentWidth}px; + } + } + + &.${verticalLayoutClasses.headerFixed} { + position: sticky; + inset-block-start: 0; + z-index: var(--header-z-index); + + &:not(.${verticalLayoutClasses.headerBlur}).scrolled.${verticalLayoutClasses.headerAttached}, + &:not(.${verticalLayoutClasses.headerBlur}).scrolled.${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar} { + background-color: var(--mui-palette-background-paper); + } + + &.${verticalLayoutClasses.headerDetached}.scrolled .${verticalLayoutClasses.navbar} { + box-shadow: var(--mui-customShadows-sm); + + [data-skin='bordered'] & { + box-shadow: none; + border-inline: 1px solid var(--border-color); + border-block-end: 1px solid var(--border-color); + } + } + &.${verticalLayoutClasses.headerDetached} .${verticalLayoutClasses.navbar} { + border-end-start-radius: var(--border-radius); + border-end-end-radius: var(--border-radius); + } + + &.${verticalLayoutClasses.headerDetached}, &.${verticalLayoutClasses.headerFloating} { + pointer-events: none; + + & .${verticalLayoutClasses.navbar} { + pointer-events: auto; + } + } + + &.${verticalLayoutClasses.headerBlur} { + &.scrolled.${verticalLayoutClasses.headerAttached}, + &.scrolled.${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar}, + &.${verticalLayoutClasses.headerFloating} + .${verticalLayoutClasses.navbar} { + backdrop-filter: blur(6px); + background-color: rgb(var(--background-color-rgb) / 0.88); + } + + &.${verticalLayoutClasses.headerFloating} { + &:before { + content: ''; + position: absolute; + z-index: -1; + inset-block-start: 0; + inset-inline: 0; + block-size: 100%; + background: linear-gradient( + 180deg, + rgb(var(--mui-palette-background-defaultChannel) / 0.7) 44%, + rgb(var(--mui-palette-background-defaultChannel) / 0.43) 73%, + rgb(var(--mui-palette-background-defaultChannel) / 0) + ); + backdrop-filter: blur(10px); + mask: linear-gradient( + var(--mui-palette-background-default), + var(--mui-palette-background-default) 18%, + transparent 100% + ); + } + } + } + + &.${verticalLayoutClasses.headerAttached}.scrolled { + box-shadow: var(--mui-customShadows-sm); + + [data-skin='bordered'] & { + box-shadow: none; + border-block-end: 1px solid var(--border-color); + } + } + + &.${verticalLayoutClasses.headerFloating} + .${verticalLayoutClasses.navbar}, + &:not(.${verticalLayoutClasses.headerFloating}).${verticalLayoutClasses.headerAttached}, + &:not(.${verticalLayoutClasses.headerFloating}).${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar} { + ${({ theme }) => + `transition: ${theme.transitions.create(['box-shadow', 'border-width', 'padding-inline', 'backdrop-filter'])}`}; + } + &:not(.${verticalLayoutClasses.headerFloating}).${verticalLayoutClasses.headerAttached} + .${verticalLayoutClasses.navbar}, + &:not(.${verticalLayoutClasses.headerFloating}).${verticalLayoutClasses.headerDetached}.scrolled + .${verticalLayoutClasses.navbar} { + padding-inline: 16px; + } + } + + &.${verticalLayoutClasses.headerFloating} { + padding-block-start: 16px; + + .${verticalLayoutClasses.navbar} { + background-color: var(--mui-palette-background-paper); + border-radius: var(--border-radius); + padding-inline: 16px; + box-shadow: var(--mui-customShadows-sm); + + [data-skin='bordered'] & { + box-shadow: none; + border: 1px solid var(--border-color); + } + } + } + + &.${verticalLayoutClasses.headerFloating} + .${verticalLayoutClasses.navbar}, + &.${verticalLayoutClasses.headerFixed}.${verticalLayoutClasses.headerDetached} + .${verticalLayoutClasses.navbar} { + inline-size: calc(100% - ${2 * themeConfig.layoutPadding}px); + } + + &:not(.${verticalLayoutClasses.headerFloating}).${verticalLayoutClasses.headerStatic} + .${verticalLayoutClasses.navbar} { + padding-inline: 16px; + } + + .${verticalLayoutClasses.navbar} { + position: relative; + padding-block: 8px; + inline-size: 100%; + } + + ${({ overrideStyles }) => overrideStyles} +` + +export default StyledHeader diff --git a/src/@layouts/utils/layoutClasses.ts b/src/@layouts/utils/layoutClasses.ts new file mode 100644 index 0000000..4f411b7 --- /dev/null +++ b/src/@layouts/utils/layoutClasses.ts @@ -0,0 +1,73 @@ +// Classes for vertical layout +export const verticalLayoutClasses = { + root: 'ts-vertical-layout', + contentWrapper: 'ts-vertical-layout-content-wrapper', + header: 'ts-vertical-layout-header', + headerFixed: 'ts-vertical-layout-header-fixed', + headerStatic: 'ts-vertical-layout-header-static', + headerFloating: 'ts-vertical-layout-header-floating', + headerDetached: 'ts-vertical-layout-header-detached', + headerAttached: 'ts-vertical-layout-header-attached', + headerContentCompact: 'ts-vertical-layout-header-content-compact', + headerContentWide: 'ts-vertical-layout-header-content-wide', + headerBlur: 'ts-vertical-layout-header-blur', + navbar: 'ts-vertical-layout-navbar', + navbarContent: 'ts-vertical-layout-navbar-content', + content: 'ts-vertical-layout-content', + contentCompact: 'ts-vertical-layout-content-compact', + contentWide: 'ts-vertical-layout-content-wide', + footer: 'ts-vertical-layout-footer', + footerStatic: 'ts-vertical-layout-footer-static', + footerFixed: 'ts-vertical-layout-footer-fixed', + footerDetached: 'ts-vertical-layout-footer-detached', + footerAttached: 'ts-vertical-layout-footer-attached', + footerContentWrapper: 'ts-vertical-layout-footer-content-wrapper', + footerContent: 'ts-vertical-layout-footer-content', + footerContentCompact: 'ts-vertical-layout-footer-content-compact', + footerContentWide: 'ts-vertical-layout-footer-content-wide' +} + +// Classes for horizontal layout +export const horizontalLayoutClasses = { + root: 'ts-horizontal-layout', + contentWrapper: 'ts-horizontal-layout-content-wrapper', + header: 'ts-horizontal-layout-header', + headerFixed: 'ts-horizontal-layout-header-fixed', + headerStatic: 'ts-horizontal-layout-header-static', + headerContentCompact: 'ts-horizontal-layout-header-content-compact', + headerContentWide: 'ts-horizontal-layout-header-content-wide', + headerBlur: 'ts-horizontal-layout-header-blur', + navbar: 'ts-horizontal-layout-navbar', + navbarContent: 'ts-horizontal-layout-navbar-content', + navigation: 'ts-horizontal-layout-navigation', + navigationContentWrapper: 'ts-horizontal-layout-navigation-content-wrapper', + content: 'ts-horizontal-layout-content', + contentCompact: 'ts-horizontal-layout-content-compact', + contentWide: 'ts-horizontal-layout-content-wide', + footer: 'ts-horizontal-layout-footer', + footerStatic: 'ts-horizontal-layout-footer-static', + footerFixed: 'ts-horizontal-layout-footer-fixed', + footerContentWrapper: 'ts-horizontal-layout-footer-content-wrapper', + footerContent: 'ts-horizontal-layout-footer-content', + footerContentCompact: 'ts-horizontal-layout-footer-content-compact', + footerContentWide: 'ts-horizontal-layout-footer-content-wide' +} + +// Classes for blank layout +export const blankLayoutClasses = { + root: 'ts-blank-layout' +} + +// Classes for front layout +export const frontLayoutClasses = { + root: 'ts-front-layout-root', + header: 'ts-front-layout-header', + navbar: 'ts-front-layout-navbar', + navbarContent: 'ts-front-layout-navbar-content', + footer: 'ts-front-layout-footer' +} + +// Common classes for Vertical and Horizontal layouts +export const commonLayoutClasses = { + contentHeightFixed: 'ts-layout-content-height-fixed' +} diff --git a/src/@menu/components/RouterLink.tsx b/src/@menu/components/RouterLink.tsx new file mode 100644 index 0000000..c4ef1cb --- /dev/null +++ b/src/@menu/components/RouterLink.tsx @@ -0,0 +1,27 @@ +'use client' + +// React Imports +import { forwardRef } from 'react' + +// Next Imports +import Link from 'next/link' +import type { LinkProps } from 'next/link' + +// Type Imports +import type { ChildrenType } from '../types' + +type RouterLinkProps = LinkProps & + Partial & { + className?: string + } + +export const RouterLink = forwardRef((props: RouterLinkProps, ref: any) => { + // Props + const { href, className, ...other } = props + + return ( + + {props.children} + + ) +}) diff --git a/src/@menu/components/horizontal-menu/HorizontalNav.tsx b/src/@menu/components/horizontal-menu/HorizontalNav.tsx new file mode 100644 index 0000000..e663766 --- /dev/null +++ b/src/@menu/components/horizontal-menu/HorizontalNav.tsx @@ -0,0 +1,110 @@ +'use client' + +// React Imports +import { useEffect, useRef } from 'react' +import type { HTMLAttributes } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { BreakpointType, ChildrenType } from '../../types' +import type { VerticalNavProps } from '../vertical-menu/VerticalNav' + +// Component Imports +import VerticalNavInHorizontal from './VerticalNavInHorizontal' + +// Hook Imports +import useMediaQuery from '../../hooks/useMediaQuery' +import useHorizontalNav from '../../hooks/useHorizontalNav' + +// Util Imports +import { horizontalNavClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledHorizontalNav from '../../styles/horizontal/StyledHorizontalNav' + +// Default Config Imports +import { defaultBreakpoints } from '../../defaultConfigs' + +export type HorizontalNavProps = HTMLAttributes & { + switchToVertical?: boolean + hideMenu?: boolean + breakpoint?: BreakpointType + customBreakpoint?: string + breakpoints?: Partial + customStyles?: CSSObject + verticalNavProps?: Pick + verticalNavContent?: ({ children }: ChildrenType) => JSX.Element + + /** + * @ignore + */ + setIsBreakpointReached?: (isBreakpointReached: boolean) => void +} + +const HorizontalNav = (props: HorizontalNavProps) => { + // Props + const { + switchToVertical = false, + hideMenu = false, + breakpoint = 'lg', + customBreakpoint, + breakpoints, + customStyles, + className, + children, + verticalNavProps, + verticalNavContent: VerticalNavContent + } = props + + // Vars + const mergedBreakpoints = { ...defaultBreakpoints, ...breakpoints } + const horizontalMenuClasses = classnames(horizontalNavClasses.root, className) + + // Refs + const prevBreakpoint = useRef(false) + + // Hooks + const { updateIsBreakpointReached } = useHorizontalNav() + + // Find the breakpoint from which screen size responsive behavior should enable and if its reached or not + const breakpointReached = useMediaQuery(customBreakpoint ?? (breakpoint ? mergedBreakpoints[breakpoint] : breakpoint)) + + // Set the breakpointReached value in the state + useEffect(() => { + if (prevBreakpoint.current === breakpointReached) return + updateIsBreakpointReached(breakpointReached) + prevBreakpoint.current = breakpointReached + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [breakpointReached]) + + // If switchToVertical is true, then render the VerticalNav component if breakpoint is reached + if (switchToVertical && breakpointReached) { + return ( + + {VerticalNavContent && {children}} + + ) + } + + // If hideMenu is true, then hide the HorizontalNav component if breakpoint is reached + if (hideMenu && breakpointReached) { + return null + } + + // If switchToVertical & hideMenu are false, then render the HorizontalNav component + return ( + + {children} + + ) +} + +export default HorizontalNav diff --git a/src/@menu/components/horizontal-menu/Menu.tsx b/src/@menu/components/horizontal-menu/Menu.tsx new file mode 100644 index 0000000..07f9110 --- /dev/null +++ b/src/@menu/components/horizontal-menu/Menu.tsx @@ -0,0 +1,124 @@ +'use client' + +// React Imports +import { createContext, forwardRef, useMemo } from 'react' +import type { ForwardRefRenderFunction, MenuHTMLAttributes, ReactElement } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import { FloatingTree } from '@floating-ui/react' + +// Type Imports +import type { MenuProps as VerticalMenuProps } from '../vertical-menu/Menu' +import type { + ChildrenType, + MenuItemStyles, + RenderExpandIconParams, + RenderExpandedMenuItemIcon, + RootStylesType +} from '../../types' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledHorizontalMenu from '../../styles/horizontal/StyledHorizontalMenu' + +// Style Imports +import styles from '../../styles/horizontal/horizontalUl.module.css' + +// Default Config Imports +import { horizontalSubMenuToggleDuration } from '../../defaultConfigs' + +export type HorizontalMenuContextProps = { + triggerPopout?: 'hover' | 'click' + browserScroll?: boolean + menuItemStyles?: MenuItemStyles + renderExpandIcon?: (params: RenderExpandIconParams) => ReactElement + renderExpandedMenuItemIcon?: RenderExpandedMenuItemIcon + transitionDuration?: number + popoutMenuOffset?: { + mainAxis?: number | ((params: { level?: number }) => number) + alignmentAxis?: number | ((params: { level?: number }) => number) + } + textTruncate?: boolean + verticalMenuProps?: Pick< + VerticalMenuProps, + | 'transitionDuration' + | 'menuSectionStyles' + | 'menuItemStyles' + | 'subMenuOpenBehavior' + | 'renderExpandIcon' + | 'renderExpandedMenuItemIcon' + | 'textTruncate' + | 'rootStyles' + > +} + +export type MenuProps = HorizontalMenuContextProps & + RootStylesType & + Partial & + MenuHTMLAttributes + +export const HorizontalMenuContext = createContext({} as HorizontalMenuContextProps) + +const Menu: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + className, + rootStyles, + menuItemStyles, + triggerPopout = 'hover', + browserScroll = false, + transitionDuration = horizontalSubMenuToggleDuration, + renderExpandIcon, + renderExpandedMenuItemIcon, + popoutMenuOffset = { mainAxis: 0 }, + textTruncate = true, + verticalMenuProps, + ...rest + } = props + + const providerValue = useMemo( + () => ({ + triggerPopout, + browserScroll, + menuItemStyles, + renderExpandIcon, + renderExpandedMenuItemIcon, + transitionDuration, + popoutMenuOffset, + textTruncate, + verticalMenuProps + }), + [ + triggerPopout, + browserScroll, + menuItemStyles, + renderExpandIcon, + renderExpandedMenuItemIcon, + transitionDuration, + popoutMenuOffset, + textTruncate, + verticalMenuProps + ] + ) + + return ( + + + +
    {children}
+
+
+
+ ) +} + +export default forwardRef(Menu) diff --git a/src/@menu/components/horizontal-menu/MenuButton.tsx b/src/@menu/components/horizontal-menu/MenuButton.tsx new file mode 100644 index 0000000..f82d909 --- /dev/null +++ b/src/@menu/components/horizontal-menu/MenuButton.tsx @@ -0,0 +1,115 @@ +// React Imports +import { cloneElement, createElement, forwardRef } from 'react' +import type { ForwardRefRenderFunction } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import { css } from '@emotion/react' + +// Type Imports +import type { ChildrenType, MenuButtonProps } from '../../types' + +// Component Imports +import { RouterLink } from '../RouterLink' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +type MenuButtonStylesProps = Partial & { + level: number + disabled?: boolean +} + +export const menuButtonStyles = (props: MenuButtonStylesProps) => { + // Props + const { level, disabled, children } = props + + return css({ + display: 'flex', + alignItems: 'center', + minBlockSize: '30px', + textDecoration: 'none', + color: 'inherit', + boxSizing: 'border-box', + cursor: 'pointer', + paddingInline: '20px', + + '&:hover': { + backgroundColor: '#f3f3f3' + }, + + '&:focus-visible': { + outline: 'none', + backgroundColor: '#f3f3f3' + }, + + ...(disabled && { + pointerEvents: 'none', + cursor: 'default', + color: '#adadad' + }), + + // All the active styles are applied to the button including menu items or submenu + [`&.${menuClasses.active}`]: { + ...(level === 0 + ? { + color: 'white', + backgroundColor: '#765feb' + } + : { + ...(children ? { backgroundColor: '#f3f3f3' } : { color: '#765feb', backgroundColor: '#765feb1f' }) + }) + } + }) +} + +const MenuButton: ForwardRefRenderFunction = ( + { className, component, children, ...rest }, + ref +) => { + if (component) { + // If component is a string, create a new element of that type + if (typeof component === 'string') { + return createElement( + component, + { + className: classnames(className), + ...rest, + ref + }, + children + ) + } else { + // Otherwise, clone the element + const { className: classNameProp, ...props } = component.props + + return cloneElement( + component, + { + className: classnames(className, classNameProp), + ...rest, + ...props, + ref + }, + children + ) + } + } else { + // If there is no component but href is defined, render RouterLink + if (rest.href) { + return ( + + {children} + + ) + } else { + return ( + + {children} + + ) + } + } +} + +export default forwardRef(MenuButton) diff --git a/src/@menu/components/horizontal-menu/MenuItem.tsx b/src/@menu/components/horizontal-menu/MenuItem.tsx new file mode 100644 index 0000000..d0ceb47 --- /dev/null +++ b/src/@menu/components/horizontal-menu/MenuItem.tsx @@ -0,0 +1,207 @@ +'use client' + +// React Imports +import { forwardRef, useContext, useEffect, useState } from 'react' +import type { AnchorHTMLAttributes, ForwardRefRenderFunction, ReactElement, MouseEvent, ReactNode } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' +import { useUpdateEffect } from 'react-use' +import type { CSSObject } from '@emotion/styled' +import { useFloatingTree } from '@floating-ui/react' + +// Type Imports +import type { ChildrenType, MenuItemElement, MenuItemExactMatchUrlProps, RootStylesType } from '../../types' + +// Context Imports +import { HorizontalSubMenuContext } from './SubMenu' + +// Component Imports +import MenuButton from './MenuButton' + +// Hook Imports +import useHorizontalMenu from '../../hooks/useHorizontalMenu' +import useVerticalNav from '../../hooks/useVerticalNav' + +// Util Imports +import { renderMenuIcon } from '../../utils/menuUtils' +import { menuClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledMenuLabel from '../../styles/StyledMenuLabel' +import StyledMenuPrefix from '../../styles/StyledMenuPrefix' +import StyledMenuSuffix from '../../styles/StyledMenuSuffix' +import StyledHorizontalMenuItem from '../../styles/horizontal/StyledHorizontalMenuItem' + +// Style Imports +import styles from '../../styles/horizontal/horizontalUl.module.css' + +export type MenuItemProps = Omit, 'prefix'> & + RootStylesType & + Partial & + MenuItemExactMatchUrlProps & { + icon?: ReactElement + prefix?: ReactNode + suffix?: ReactNode + disabled?: boolean + target?: string + rel?: string + component?: string | ReactElement + onActiveChange?: (active: boolean) => void + + /** + * @ignore + */ + level?: number + } + +const MenuItem: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + icon, + className, + prefix, + suffix, + level = 0, + disabled = false, + exactMatch = true, + activeUrl, + component, + onActiveChange, + rootStyles, + ...rest + } = props + + // States + const [active, setActive] = useState(false) + + // Hooks + const tree = useFloatingTree() + const pathname = usePathname() + const { toggleVerticalNav, isToggled } = useVerticalNav() + const { getItemProps } = useContext(HorizontalSubMenuContext) + const { menuItemStyles, renderExpandedMenuItemIcon, textTruncate } = useHorizontalMenu() + + const getMenuItemStyles = (element: MenuItemElement): CSSObject | undefined => { + // If the menuItemStyles prop is provided, get the styles for the specified element. + if (menuItemStyles) { + // Define the parameters that are passed to the style functions. + const params = { level, disabled, active, isSubmenu: false } + + // Get the style function for the specified element. + const styleFunction = menuItemStyles[element] + + if (styleFunction) { + // If the style function is a function, call it and return the result. + // Otherwise, return the style function itself. + return typeof styleFunction === 'function' ? styleFunction(params) : styleFunction + } + } + } + + // Handle the click event. + const handleClick = () => { + if (isToggled) { + toggleVerticalNav() + } + } + + // Change active state when the url changes + useEffect(() => { + const href = rest.href || (component && typeof component !== 'string' && component.props.href) + + if (href) { + // Check if the current url matches any of the children urls + if (exactMatch ? pathname === href : activeUrl && pathname.includes(activeUrl)) { + setActive(true) + } else { + setActive(false) + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + // Call the onActiveChange callback when the active state changes. + useUpdateEffect(() => { + onActiveChange?.(active) + }, [active]) + + return ( + + ) { + props.onClick?.(event) + tree?.events.emit('click') + } + })} + {...rest} + > + {/* Menu Item Icon */} + {renderMenuIcon({ + icon, + level, + active, + disabled, + renderExpandedMenuItemIcon, + styles: getMenuItemStyles('icon') + })} + + {/* Menu Item Prefix */} + {prefix && ( + + {prefix} + + )} + + {/* Menu Item Label */} + + {children} + + + {/* Menu Item Suffix */} + {suffix && ( + + {suffix} + + )} + + + ) +} + +export default forwardRef(MenuItem) diff --git a/src/@menu/components/horizontal-menu/SubMenu.tsx b/src/@menu/components/horizontal-menu/SubMenu.tsx new file mode 100644 index 0000000..3365037 --- /dev/null +++ b/src/@menu/components/horizontal-menu/SubMenu.tsx @@ -0,0 +1,463 @@ +'use client' + +// React Imports +import { Children, cloneElement, createContext, forwardRef, useEffect, useRef, useState } from 'react' +import type { + AnchorHTMLAttributes, + ForwardRefRenderFunction, + KeyboardEvent, + MouseEvent, + ReactElement, + HTMLProps, + ReactNode +} from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' +import styled from '@emotion/styled' +import { + useFloating, + autoUpdate, + offset, + flip, + shift, + useHover, + useRole, + useInteractions, + useClick, + safePolygon, + useDismiss, + useFloatingNodeId, + FloatingNode, + FloatingPortal, + useMergeRefs, + useFloatingParentNodeId, + useFloatingTree, + useTransitionStyles +} from '@floating-ui/react' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType, RootStylesType, SubMenuItemElement } from '../../types' +import type { MenuItemProps } from './MenuItem' + +// Component Imports +import SubMenuContent from './SubMenuContent' + +// Hook Imports +import useHorizontalMenu from '../../hooks/useHorizontalMenu' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' +import { confirmUrlInChildren, renderMenuIcon } from '../../utils/menuUtils' + +// Styled Component Imports +import MenuButton, { menuButtonStyles } from './MenuButton' +import StyledMenuLabel from '../../styles/StyledMenuLabel' +import StyledMenuPrefix from '../../styles/StyledMenuPrefix' +import StyledMenuSuffix from '../../styles/StyledMenuSuffix' +import StyledHorizontalNavExpandIcon, { + StyledHorizontalNavExpandIconWrapper +} from '../../styles/horizontal/StyledHorizontalNavExpandIcon' +import StyledSubMenuContentWrapper from '../../styles/horizontal/StyledHorizontalSubMenuContentWrapper' + +// Style Imports +import ulStyles from '../../styles/horizontal/horizontalUl.module.css' + +// Icon Imports +import ChevronRight from '../../svg/ChevronRight' + +export type SubMenuProps = Omit, 'prefix'> & + RootStylesType & + Partial & { + label: ReactNode + icon?: ReactElement + prefix?: ReactNode + suffix?: ReactNode + disabled?: boolean + component?: string | ReactElement + contentClassName?: string + onOpenChange?: (open: boolean) => void + + /** + * @ignore + */ + level?: number + } + +type StyledSubMenuProps = Pick & { + level: number + active?: boolean + menuItemStyles?: CSSObject + buttonStyles?: CSSObject +} + +type HorizontalSubMenuContextProps = { + getItemProps: (userProps?: HTMLProps) => Record +} + +const StyledSubMenu = styled.li` + ${({ level }) => level === 0 && { borderRadius: '6px', overflow: 'hidden' }} + + &.${menuClasses.open} > .${menuClasses.button} { + background-color: #f3f3f3; + } + + ${({ menuItemStyles }) => menuItemStyles}; + ${({ rootStyles }) => rootStyles}; + + > .${menuClasses.button} { + ${({ level, disabled, children }) => + menuButtonStyles({ + level, + disabled, + children + })}; + ${({ buttonStyles }) => buttonStyles}; + } +` + +export const HorizontalSubMenuContext = createContext({ getItemProps: () => ({}) }) + +const SubMenu: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + className, + contentClassName, + label, + icon, + title, + prefix, + suffix, + level = 0, + disabled = false, + rootStyles, + component, + onClick, + onKeyUp, + onOpenChange, + ...rest + } = props + + // States + const [open, setOpen] = useState(false) + const [active, setActive] = useState(false) + + // Refs + const dir = useRef('ltr') + const listItemsRef = useRef>([]) + + // Hooks + const pathname = usePathname() + const tree = useFloatingTree() + const nodeId = useFloatingNodeId() + const parentId = useFloatingParentNodeId() + + const { + triggerPopout, + renderExpandIcon, + menuItemStyles, + browserScroll, + transitionDuration, + renderExpandedMenuItemIcon, + popoutMenuOffset, + textTruncate + } = useHorizontalMenu() + + // Vars + // Filter out falsy values from children + const childNodes = Children.toArray(children).filter(Boolean) as [ReactElement] + + const mainAxisOffset = + popoutMenuOffset && + popoutMenuOffset.mainAxis && + (typeof popoutMenuOffset.mainAxis === 'function' ? popoutMenuOffset.mainAxis({ level }) : popoutMenuOffset.mainAxis) + + const alignmentAxisOffset = + popoutMenuOffset && + popoutMenuOffset.alignmentAxis && + (typeof popoutMenuOffset.alignmentAxis === 'function' + ? popoutMenuOffset.alignmentAxis({ level }) + : popoutMenuOffset.alignmentAxis) + + useEffect(() => { + dir.current = window.getComputedStyle(document.documentElement).getPropertyValue('direction') + }, []) + + const { y, refs, floatingStyles, context } = useFloating({ + open, + nodeId, + onOpenChange: setOpen, + placement: level > 0 ? (dir.current !== 'rtl' ? 'right-start' : 'left-start') : 'bottom-start', + middleware: [ + offset({ + mainAxis: mainAxisOffset, + alignmentAxis: alignmentAxisOffset + }), + flip({ crossAxis: false }), + shift() + ], + whileElementsMounted: autoUpdate + }) + + // Floating UI Transition Styles + const { isMounted, styles } = useTransitionStyles(context, { + // Configure both open and close durations: + duration: transitionDuration, + + initial: { + opacity: 0, + transform: 'translateY(10px)' + }, + open: { + opacity: 1, + transform: 'translateY(0px)' + }, + close: { + opacity: 0, + transform: 'translateY(10px)' + } + }) + + const hover = useHover(context, { + handleClose: safePolygon({ + blockPointerEvents: true + }), // safePolygon function allows us to reach to submenu + restMs: 25, // Only opens submenu when cursor rests for 25ms on a menu + enabled: triggerPopout === 'hover', // Only enable hover effect when triggerPopout option is set to 'hover', + delay: { open: 75 } // Delay opening submenu by 75ms + }) + + const click = useClick(context, { + enabled: triggerPopout === 'click', // Only enable click effect when triggerPopout option is set to 'click' + toggle: false + }) + + const dismiss = useDismiss(context) + const role = useRole(context, { role: 'menu' }) + + // Merge all the interactions into prop getters + const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([hover, click, dismiss, role]) + + const handleOnClick = (event: MouseEvent) => { + onClick?.(event) + triggerPopout === 'click' && setOpen(!open) + } + + const handleOnKeyUp = (event: KeyboardEvent) => { + onKeyUp?.(event) + + if (event.key === 'Enter') { + setOpen(!open) + } + } + + const getSubMenuItemStyles = (element: SubMenuItemElement): CSSObject | undefined => { + // If the menuItemStyles prop is provided, get the styles for the specified element. + if (menuItemStyles) { + // Define the parameters that are passed to the style functions. + const params = { level, disabled, active, isSubmenu: true, open: open } + + // Get the style function for the specified element. + const styleFunction = menuItemStyles[element] + + if (styleFunction) { + // If the style function is a function, call it and return the result. + // Otherwise, return the style function itself. + return typeof styleFunction === 'function' ? styleFunction(params) : styleFunction + } + } + } + + // Event emitter allows you to communicate across tree components. + // This effect closes all menus when an item gets clicked anywhere in the tree. + useEffect(() => { + const handleTreeClick = () => { + setOpen(false) + } + + const onSubMenuOpen = (event: { nodeId: string; parentId: string }) => { + if (event.nodeId !== nodeId && event.parentId === parentId) { + setOpen(false) + } + } + + tree?.events.on('click', handleTreeClick) + tree?.events.on('menuopen', onSubMenuOpen) + + return () => { + tree?.events.off('click', handleTreeClick) + tree?.events.off('menuopen', onSubMenuOpen) + } + }, [tree, nodeId, parentId]) + + useEffect(() => { + if (open) { + tree?.events.emit('menuopen', { + parentId, + nodeId + }) + } + }, [tree, open, nodeId, parentId]) + + // Change active state when the url changes + useEffect(() => { + // Check if the current url matches any of the children urls + if (confirmUrlInChildren(children, pathname)) { + setActive(true) + } else { + setActive(false) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + // User event handler for open state change + useEffect(() => { + onOpenChange?.(open) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]) + + // Merge the reference ref with the ref passed to the component + const referenceRef = useMergeRefs([refs.setReference, ref]) + + return ( + + {/* Sub Menu */} + + {/* Sub Menu */} + + {/* Sub Menu Icon */} + {renderMenuIcon({ + icon, + level, + active, + disabled, + renderExpandedMenuItemIcon, + styles: getSubMenuItemStyles('icon') + })} + + {/* Sub Menu Prefix */} + {prefix && ( + + {prefix} + + )} + + {/* Sub Menu Label */} + + {label} + + + {/* Sub Menu Suffix */} + {suffix && ( + + {suffix} + + )} + + {/* Sub Menu Toggle Icon Wrapper */} + + {renderExpandIcon ? ( + renderExpandIcon({ + level, + disabled, + active, + open: open + }) + ) : ( + // eslint-disable-next-line lines-around-comment + /* Expanded Arrow Icon */ + + + + )} + + + + + + {isMounted && ( + + + {childNodes.map((node, index) => + cloneElement(node, { + ...getItemProps({ + ref(node: HTMLButtonElement) { + listItemsRef.current[index] = node + }, + onClick(event: MouseEvent) { + if (node.props.children && !Array.isArray(node.props.children)) { + node.props.onClick?.(event) + tree?.events.emit('click') + } + } + }), + level: level + 1 + }) + )} + + + )} + + + + + ) +} + +export default forwardRef(SubMenu) diff --git a/src/@menu/components/horizontal-menu/SubMenuContent.tsx b/src/@menu/components/horizontal-menu/SubMenuContent.tsx new file mode 100644 index 0000000..3487775 --- /dev/null +++ b/src/@menu/components/horizontal-menu/SubMenuContent.tsx @@ -0,0 +1,54 @@ +// React Imports +import { forwardRef } from 'react' +import type { ForwardRefRenderFunction, HTMLAttributes } from 'react' + +// Third-party Imports +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { ChildrenType, RootStylesType } from '../../types' + +// Styled Component Imports +import StyledHorizontalSubMenuContent from '../../styles/horizontal/StyledHorizontalSubMenuContent' + +// Style Imports +import styles from '../../styles/styles.module.css' + +export type SubMenuContentProps = HTMLAttributes & + RootStylesType & + Partial & { + open?: boolean + browserScroll?: boolean + firstLevel?: boolean + top?: number + } + +const SubMenuContent: ForwardRefRenderFunction = (props, ref) => { + // Props + const { children, open, firstLevel, top, browserScroll, ...rest } = props + + return ( + + {/* If browserScroll is false render PerfectScrollbar */} + {!browserScroll ? ( + +
    {children}
+
+ ) : ( +
    {children}
+ )} +
+ ) +} + +export default forwardRef(SubMenuContent) diff --git a/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.tsx b/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.tsx new file mode 100644 index 0000000..9589d62 --- /dev/null +++ b/src/@menu/components/horizontal-menu/VerticalNavInHorizontal.tsx @@ -0,0 +1,32 @@ +// Type Imports +import type { BreakpointType, ChildrenType } from '../../types' +import type { VerticalNavProps } from '../vertical-menu/VerticalNav' + +// Component Imports +import VerticalNav from '../../vertical-menu' + +// Type +type VerticalNavInHorizontalProps = ChildrenType & { + className?: string + breakpoint?: BreakpointType + customBreakpoint?: string + verticalNavProps?: Pick +} + +const VerticalNavInHorizontal = (props: VerticalNavInHorizontalProps) => { + // Props + const { children, className, breakpoint, customBreakpoint, verticalNavProps } = props + + return ( + + {children} + + ) +} + +export default VerticalNavInHorizontal diff --git a/src/@menu/components/vertical-menu/Menu.tsx b/src/@menu/components/vertical-menu/Menu.tsx new file mode 100644 index 0000000..6d34b2b --- /dev/null +++ b/src/@menu/components/vertical-menu/Menu.tsx @@ -0,0 +1,229 @@ +'use client' + +// React Imports +import { createContext, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import type { ForwardRefRenderFunction, MenuHTMLAttributes, MutableRefObject, ReactElement, ReactNode } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' +import { FloatingTree } from '@floating-ui/react' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { + ChildrenType, + MenuItemStyles, + RootStylesType, + RenderExpandIconParams, + RenderExpandedMenuItemIcon +} from '../../types' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledVerticalMenu from '../../styles/vertical/StyledVerticalMenu' + +// Style Imports +import styles from '../../styles/styles.module.css' + +// Default Config Imports +import { verticalSubMenuToggleDuration } from '../../defaultConfigs' + +export type MenuSectionStyles = { + root?: CSSObject + label?: CSSObject + prefix?: CSSObject + suffix?: CSSObject + icon?: CSSObject +} + +export type OpenSubmenu = { + level: number + label: ReactNode + active: boolean + id: string +} + +export type VerticalMenuContextProps = { + browserScroll?: boolean + triggerPopout?: 'hover' | 'click' + transitionDuration?: number + menuSectionStyles?: MenuSectionStyles + menuItemStyles?: MenuItemStyles + subMenuOpenBehavior?: 'accordion' | 'collapse' + renderExpandIcon?: (params: RenderExpandIconParams) => ReactElement + renderExpandedMenuItemIcon?: RenderExpandedMenuItemIcon + collapsedMenuSectionLabel?: ReactNode + popoutMenuOffset?: { + mainAxis?: number | ((params: { level?: number }) => number) + alignmentAxis?: number | ((params: { level?: number }) => number) + } + textTruncate?: boolean + + /** + * @ignore + */ + openSubmenu?: OpenSubmenu[] + + /** + * @ignore + */ + openSubmenusRef?: MutableRefObject + + /** + * @ignore + */ + toggleOpenSubmenu?: (...submenus: { level: number; label: ReactNode; active?: boolean; id: string }[]) => void +} + +export type MenuProps = VerticalMenuContextProps & + RootStylesType & + Partial & + MenuHTMLAttributes & { + popoutWhenCollapsed?: boolean + } + +export const VerticalMenuContext = createContext({} as VerticalMenuContextProps) + +const Menu: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + className, + rootStyles, + menuItemStyles, + renderExpandIcon, + renderExpandedMenuItemIcon, + menuSectionStyles, + browserScroll = false, + triggerPopout = 'hover', + popoutWhenCollapsed = false, + subMenuOpenBehavior = 'accordion', // accordion, collapse + transitionDuration = verticalSubMenuToggleDuration, + collapsedMenuSectionLabel = '-', + popoutMenuOffset = { mainAxis: 0 }, + textTruncate = true, + ...rest + } = props + + // States + const [openSubmenu, setOpenSubmenu] = useState([]) + + // Refs + const openSubmenusRef = useRef([]) + + // Hooks + const pathname = usePathname() + const { updateVerticalNavState } = useVerticalNav() + + const toggleOpenSubmenu = useCallback( + (...submenus: { level: number; label: ReactNode; active?: boolean; id: string }[]): void => { + if (!submenus.length) return + + const openSubmenuCopy = [...openSubmenu] + + submenus.forEach(({ level, label, active = false, id }) => { + const submenuIndex = openSubmenuCopy.findIndex(submenu => submenu.id === id) + const submenuExists = submenuIndex >= 0 + const isAccordion = subMenuOpenBehavior === 'accordion' + + const inactiveSubmenuIndex = openSubmenuCopy.findIndex(submenu => !submenu.active && submenu.level === 0) + + // Delete submenu if it exists + if (submenuExists) { + openSubmenuCopy.splice(submenuIndex, 1) + } + + if (isAccordion) { + // Add submenu if it doesn't exist + if (!submenuExists) { + if (inactiveSubmenuIndex >= 0 && !active && level === 0) { + openSubmenuCopy.splice(inactiveSubmenuIndex, 1, { level, label, active, id }) + } else { + openSubmenuCopy.push({ level, label, active, id }) + } + } + } else { + // Add submenu if it doesn't exist + if (!submenuExists) { + openSubmenuCopy.push({ level, label, active, id }) + } + } + }) + + setOpenSubmenu(openSubmenuCopy) + }, + [openSubmenu, subMenuOpenBehavior] + ) + + useEffect(() => { + setOpenSubmenu([...openSubmenusRef.current]) + openSubmenusRef.current = [] + }, [pathname]) + + // UseEffect, update verticalNav state to set initial values and update values on change + useEffect(() => { + updateVerticalNavState({ + isPopoutWhenCollapsed: popoutWhenCollapsed + }) + }, [popoutWhenCollapsed, updateVerticalNavState]) + + const providerValue = useMemo( + () => ({ + browserScroll, + triggerPopout, + transitionDuration, + menuItemStyles, + menuSectionStyles, + renderExpandIcon, + renderExpandedMenuItemIcon, + openSubmenu, + openSubmenusRef, + toggleOpenSubmenu, + subMenuOpenBehavior, + collapsedMenuSectionLabel, + popoutMenuOffset, + textTruncate + }), + [ + browserScroll, + triggerPopout, + transitionDuration, + menuItemStyles, + menuSectionStyles, + renderExpandIcon, + renderExpandedMenuItemIcon, + openSubmenu, + openSubmenusRef, + toggleOpenSubmenu, + subMenuOpenBehavior, + collapsedMenuSectionLabel, + popoutMenuOffset, + textTruncate + ] + ) + + return ( + + + +
    {children}
+
+
+
+ ) +} + +export default forwardRef(Menu) diff --git a/src/@menu/components/vertical-menu/MenuButton.tsx b/src/@menu/components/vertical-menu/MenuButton.tsx new file mode 100644 index 0000000..ccc5562 --- /dev/null +++ b/src/@menu/components/vertical-menu/MenuButton.tsx @@ -0,0 +1,113 @@ +// React Imports +import { cloneElement, createElement, forwardRef } from 'react' +import type { ForwardRefRenderFunction } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import { css } from '@emotion/react' + +// Type Imports +import type { ChildrenType, MenuButtonProps } from '../../types' + +// Component Imports +import { RouterLink } from '../RouterLink' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +type MenuButtonStylesProps = Partial & { + level: number + active?: boolean + disabled?: boolean + isCollapsed?: boolean + isPopoutWhenCollapsed?: boolean +} + +export const menuButtonStyles = (props: MenuButtonStylesProps) => { + // Props + const { level, disabled, children, isCollapsed, isPopoutWhenCollapsed } = props + + return css({ + display: 'flex', + alignItems: 'center', + minBlockSize: '30px', + textDecoration: 'none', + color: 'inherit', + boxSizing: 'border-box', + cursor: 'pointer', + paddingInlineEnd: '20px', + paddingInlineStart: `${level === 0 ? 20 : (isPopoutWhenCollapsed && isCollapsed ? level : level + 1) * 20}px`, + + '&:hover, &[aria-expanded="true"]': { + backgroundColor: '#f3f3f3' + }, + + '&:focus-visible': { + outline: 'none', + backgroundColor: '#f3f3f3' + }, + + ...(disabled && { + pointerEvents: 'none', + cursor: 'default', + color: '#adadad' + }), + + // All the active styles are applied to the button including menu items or submenu + [`&.${menuClasses.active}`]: { + ...(!children && { color: 'white' }), + backgroundColor: children ? '#f3f3f3' : '#765feb' + } + }) +} + +const MenuButton: ForwardRefRenderFunction = ( + { className, component, children, ...rest }, + ref +) => { + if (component) { + // If component is a string, create a new element of that type + if (typeof component === 'string') { + return createElement( + component, + { + className: classnames(className), + ...rest, + ref + }, + children + ) + } else { + // Otherwise, clone the element + const { className: classNameProp, ...props } = component.props + + return cloneElement( + component, + { + className: classnames(className, classNameProp), + ...rest, + ...props, + ref + }, + children + ) + } + } else { + // If there is no component but href is defined, render RouterLink + if (rest.href) { + return ( + + {children} + + ) + } else { + return ( + + {children} + + ) + } + } +} + +export default forwardRef(MenuButton) diff --git a/src/@menu/components/vertical-menu/MenuItem.tsx b/src/@menu/components/vertical-menu/MenuItem.tsx new file mode 100644 index 0000000..1ca7585 --- /dev/null +++ b/src/@menu/components/vertical-menu/MenuItem.tsx @@ -0,0 +1,204 @@ +'use client' + +// React Imports +import { forwardRef, useEffect, useState } from 'react' +import type { AnchorHTMLAttributes, ForwardRefRenderFunction, ReactElement, ReactNode } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' +import { useUpdateEffect } from 'react-use' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType, MenuItemElement, MenuItemExactMatchUrlProps, RootStylesType } from '../../types' + +// Component Imports +import MenuButton from './MenuButton' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' +import useVerticalMenu from '../../hooks/useVerticalMenu' + +// Util Imports +import { renderMenuIcon } from '../../utils/menuUtils' +import { menuClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledMenuLabel from '../../styles/StyledMenuLabel' +import StyledMenuPrefix from '../../styles/StyledMenuPrefix' +import StyledMenuSuffix from '../../styles/StyledMenuSuffix' +import StyledVerticalMenuItem from '../../styles/vertical/StyledVerticalMenuItem' + +export type MenuItemProps = Omit, 'prefix'> & + RootStylesType & + Partial & + MenuItemExactMatchUrlProps & { + icon?: ReactElement + prefix?: ReactNode + suffix?: ReactNode + disabled?: boolean + target?: string + rel?: string + component?: string | ReactElement + onActiveChange?: (active: boolean) => void + + /** + * @ignore + */ + level?: number + } + +const MenuItem: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + icon, + className, + prefix, + suffix, + level = 0, + disabled = false, + exactMatch = true, + activeUrl, + component, + onActiveChange, + rootStyles, + ...rest + } = props + + // States + const [active, setActive] = useState(false) + + // Hooks + const pathname = usePathname() + const { menuItemStyles, renderExpandedMenuItemIcon, textTruncate } = useVerticalMenu() + + const { isCollapsed, isHovered, isPopoutWhenCollapsed, toggleVerticalNav, isToggled, isBreakpointReached } = + useVerticalNav() + + // Get the styles for the specified element. + const getMenuItemStyles = (element: MenuItemElement): CSSObject | undefined => { + // If the menuItemStyles prop is provided, get the styles for the specified element. + if (menuItemStyles) { + // Define the parameters that are passed to the style functions. + const params = { level, disabled, active, isSubmenu: false } + + // Get the style function for the specified element. + const styleFunction = menuItemStyles[element] + + if (styleFunction) { + // If the style function is a function, call it and return the result. + // Otherwise, return the style function itself. + return typeof styleFunction === 'function' ? styleFunction(params) : styleFunction + } + } + } + + // Handle the click event. + const handleClick = () => { + if (isToggled) { + toggleVerticalNav() + } + } + + // Change active state when the url changes + useEffect(() => { + const href = rest.href || (component && typeof component !== 'string' && component.props.href) + + if (href) { + // Check if the current url matches any of the children urls + if (exactMatch ? pathname === href : activeUrl && pathname.includes(activeUrl)) { + setActive(true) + } else { + setActive(false) + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + // Call the onActiveChange callback when the active state changes. + useUpdateEffect(() => { + onActiveChange?.(active) + }, [active]) + + return ( + + { + handleClick() + rest.onClick && rest.onClick(e) + }} + > + {/* Menu Item Icon */} + {renderMenuIcon({ + icon, + level, + active, + disabled, + renderExpandedMenuItemIcon, + styles: getMenuItemStyles('icon'), + isBreakpointReached + })} + + {/* Menu Item Prefix */} + {prefix && ( + + {prefix} + + )} + + {/* Menu Item Label */} + + {children} + + + {/* Menu Item Suffix */} + {suffix && ( + + {suffix} + + )} + + + ) +} + +export default forwardRef(MenuItem) diff --git a/src/@menu/components/vertical-menu/MenuSection.tsx b/src/@menu/components/vertical-menu/MenuSection.tsx new file mode 100644 index 0000000..22c6f4b --- /dev/null +++ b/src/@menu/components/vertical-menu/MenuSection.tsx @@ -0,0 +1,145 @@ +'use client' + +// React Imports +import { forwardRef } from 'react' +import type { ForwardRefRenderFunction, CSSProperties, ReactElement, ReactNode } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { MenuSectionStyles } from './Menu' +import type { ChildrenType, RootStylesType } from '../../types' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' +import useVerticalMenu from '../../hooks/useVerticalMenu' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledMenuIcon from '../../styles/StyledMenuIcon' +import StyledMenuPrefix from '../../styles/StyledMenuPrefix' +import StyledMenuSuffix from '../../styles/StyledMenuSuffix' +import StyledMenuSectionLabel from '../../styles/StyledMenuSectionLabel' +import StyledVerticalMenuSection from '../../styles/vertical/StyledVerticalMenuSection' + +export type MenuSectionProps = Partial & + RootStylesType & { + label: ReactNode + icon?: ReactElement + prefix?: ReactNode + suffix?: ReactNode + + /** + * @ignore + */ + className?: string + } + +type MenuSectionElement = keyof MenuSectionStyles + +const menuSectionWrapperStyles: CSSProperties = { + display: 'inline-block', + inlineSize: '100%', + position: 'relative', + listStyle: 'none', + padding: 0, + overflow: 'hidden' +} + +const menuSectionContentStyles: CSSProperties = { + display: 'flex', + alignItems: 'center', + inlineSize: '100%', + position: 'relative', + paddingBlock: '0.75rem', + paddingInline: '1.25rem', + overflow: 'hidden' +} + +const MenuSection: ForwardRefRenderFunction = (props, ref) => { + // Props + const { children, icon, className, prefix, suffix, label, rootStyles, ...rest } = props + + // Hooks + const { isCollapsed, isHovered } = useVerticalNav() + const { menuSectionStyles, collapsedMenuSectionLabel, textTruncate } = useVerticalMenu() + + const getMenuSectionStyles = (element: MenuSectionElement): CSSObject | undefined => { + // If the menuSectionStyles prop is provided, get the styles for the element from the prop + if (menuSectionStyles) { + return menuSectionStyles[element] + } + } + + return ( + // eslint-disable-next-line lines-around-comment + // Menu Section + + {/* Menu Section Content Wrapper */} +
    + {/* Menu Section Content */} +
  • + {icon && ( + + {icon} + + )} + {prefix && ( + + {prefix} + + )} + {collapsedMenuSectionLabel && isCollapsed && !isHovered ? ( + + {collapsedMenuSectionLabel} + + ) : ( + label && ( + + {label} + + ) + )} + {suffix && ( + + {suffix} + + )} +
  • + {/* Render Child */} + {children} +
+
+ ) +} + +export default forwardRef(MenuSection) diff --git a/src/@menu/components/vertical-menu/NavCollapseIcons.tsx b/src/@menu/components/vertical-menu/NavCollapseIcons.tsx new file mode 100644 index 0000000..45fcb6b --- /dev/null +++ b/src/@menu/components/vertical-menu/NavCollapseIcons.tsx @@ -0,0 +1,81 @@ +'use client' + +// React Imports +import type { HTMLAttributes, ReactElement } from 'react' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' + +// Icon Imports +import CloseIcon from '../../svg/Close' +import RadioCircleIcon from '../../svg/RadioCircle' +import RadioCircleMarkedIcon from '../../svg/RadioCircleMarked' + +type NavCollapseIconsProps = HTMLAttributes & { + closeIcon?: ReactElement + lockedIcon?: ReactElement + unlockedIcon?: ReactElement + onClick?: () => void + onClose?: () => void +} + +const NavCollapseIcons = (props: NavCollapseIconsProps) => { + // Props + const { closeIcon, lockedIcon, unlockedIcon, onClick, onClose, ...rest } = props + + // Hooks + const { isCollapsed, collapseVerticalNav, isBreakpointReached, toggleVerticalNav } = useVerticalNav() + + // Handle Lock / Unlock Icon Buttons click + const handleClick = (action: 'lock' | 'unlock') => { + // Setup the verticalNav to be locked or unlocked + const collapse = action === 'lock' ? false : true + + // Tell the verticalNav to lock or unlock + collapseVerticalNav(collapse) + + // Call onClick function if passed + onClick && onClick() + } + + // Handle Close button click + const handleClose = () => { + // Close verticalNav using toggle verticalNav function + toggleVerticalNav(false) + + // Call onClose function if passed + onClose && onClose() + } + + return ( + <> + {isBreakpointReached ? ( + + {closeIcon ?? } + + ) : isCollapsed ? ( + handleClick('lock')} + {...rest} + > + {unlockedIcon ?? } + + ) : ( + handleClick('unlock')} + {...rest} + > + {lockedIcon ?? } + + )} + + ) +} + +export default NavCollapseIcons diff --git a/src/@menu/components/vertical-menu/NavHeader.tsx b/src/@menu/components/vertical-menu/NavHeader.tsx new file mode 100644 index 0000000..39756a2 --- /dev/null +++ b/src/@menu/components/vertical-menu/NavHeader.tsx @@ -0,0 +1,50 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { ChildrenType } from '../../types' +import type { VerticalNavContextProps } from '../../contexts/verticalNavContext' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' + +// Util Imports +import { verticalNavClasses } from '../../utils/menuClasses' + +type StyledNavHeaderProps = { + isHovered?: VerticalNavContextProps['isHovered'] + isCollapsed?: VerticalNavContextProps['isCollapsed'] + collapsedWidth?: VerticalNavContextProps['collapsedWidth'] + transitionDuration?: VerticalNavContextProps['transitionDuration'] +} + +const StyledNavHeader = styled.div` + padding: 15px; + padding-inline-start: 20px; + display: flex; + align-items: center; + justify-content: space-between; + transition: ${({ transitionDuration }) => `padding-inline ${transitionDuration}ms ease-in-out`}; + + ${({ isHovered, isCollapsed, collapsedWidth }) => + isCollapsed && !isHovered && `padding-inline: calc((${collapsedWidth}px - 1px - 22px) / 2);`} +` + +const NavHeader = ({ children }: ChildrenType) => { + // Hooks + const { isHovered, isCollapsed, collapsedWidth, transitionDuration } = useVerticalNav() + + return ( + + {children} + + ) +} + +export default NavHeader diff --git a/src/@menu/components/vertical-menu/SubMenu.tsx b/src/@menu/components/vertical-menu/SubMenu.tsx new file mode 100644 index 0000000..b719462 --- /dev/null +++ b/src/@menu/components/vertical-menu/SubMenu.tsx @@ -0,0 +1,466 @@ +'use client' + +// React Imports +import { Children, cloneElement, forwardRef, useEffect, useId, useLayoutEffect, useRef, useState } from 'react' +import type { + AnchorHTMLAttributes, + ForwardRefRenderFunction, + KeyboardEvent, + MouseEvent, + ReactElement, + ReactNode +} from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' +import styled from '@emotion/styled' +import { + useFloating, + autoUpdate, + offset, + flip, + shift, + useHover, + useRole, + useInteractions, + useClick, + safePolygon, + useDismiss, + hide, + useFloatingTree, + FloatingPortal +} from '@floating-ui/react' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { OpenSubmenu } from './Menu' +import type { MenuItemProps } from './MenuItem' +import type { ChildrenType, RootStylesType, SubMenuItemElement } from '../../types' + +// Component Imports +import SubMenuContent from './SubMenuContent' +import MenuButton, { menuButtonStyles } from './MenuButton' + +// Icon Imports +import ChevronRight from '../../svg/ChevronRight' + +// Hook Imports +import useVerticalNav from '../../hooks/useVerticalNav' +import useVerticalMenu from '../../hooks/useVerticalMenu' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' +import { confirmUrlInChildren, renderMenuIcon } from '../../utils/menuUtils' + +// Styled Component Imports +import StyledMenuLabel from '../../styles/StyledMenuLabel' +import StyledMenuPrefix from '../../styles/StyledMenuPrefix' +import StyledMenuSuffix from '../../styles/StyledMenuSuffix' +import StyledVerticalNavExpandIcon, { + StyledVerticalNavExpandIconWrapper +} from '../../styles/vertical/StyledVerticalNavExpandIcon' + +export type SubMenuProps = Omit, 'prefix'> & + RootStylesType & + Partial & { + label: ReactNode + icon?: ReactElement + prefix?: ReactNode + suffix?: ReactNode + defaultOpen?: boolean + disabled?: boolean + component?: string | ReactElement + contentClassName?: string + onOpenChange?: (open: boolean) => void + + /** + * @ignore + */ + level?: number + } + +type StyledSubMenuProps = Pick & { + level: number + active?: boolean + menuItemStyles?: CSSObject + isPopoutWhenCollapsed?: boolean + isCollapsed?: boolean + buttonStyles?: CSSObject +} + +const StyledSubMenu = styled.li` + position: relative; + inline-size: 100%; + margin-block-start: 4px; + + &.${menuClasses.open} > .${menuClasses.button} { + background-color: #f3f3f3; + } + + ${({ menuItemStyles }) => menuItemStyles}; + ${({ rootStyles }) => rootStyles}; + + > .${menuClasses.button} { + ${({ level, disabled, active, children, isCollapsed, isPopoutWhenCollapsed }) => + menuButtonStyles({ + level, + active, + disabled, + children, + isCollapsed, + isPopoutWhenCollapsed + })}; + ${({ buttonStyles }) => buttonStyles}; + } +` + +const SubMenu: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + className, + contentClassName, + label, + icon, + title, + prefix, + suffix, + defaultOpen, + level = 0, + disabled = false, + rootStyles, + component, + onOpenChange, + onClick, + onKeyUp, + ...rest + } = props + + // States + const [openWhenCollapsed, setOpenWhenCollapsed] = useState(false) + const [active, setActive] = useState(false) + + // Refs + const contentRef = useRef(null) + + // Hooks + const id = useId() + const pathname = usePathname() + const { isCollapsed, isPopoutWhenCollapsed, isHovered, isBreakpointReached } = useVerticalNav() + const tree = useFloatingTree() + + const { + browserScroll, + triggerPopout, + renderExpandIcon, + renderExpandedMenuItemIcon, + menuItemStyles, + openSubmenu, + toggleOpenSubmenu, + transitionDuration, + openSubmenusRef, + popoutMenuOffset, + textTruncate + } = useVerticalMenu() + + // Vars + // Filter out falsy values from children + const childNodes = Children.toArray(children).filter(Boolean) as [ReactElement] + + const mainAxisOffset = + popoutMenuOffset && + popoutMenuOffset.mainAxis && + (typeof popoutMenuOffset.mainAxis === 'function' ? popoutMenuOffset.mainAxis({ level }) : popoutMenuOffset.mainAxis) + + const alignmentAxisOffset = + popoutMenuOffset && + popoutMenuOffset.alignmentAxis && + (typeof popoutMenuOffset.alignmentAxis === 'function' + ? popoutMenuOffset.alignmentAxis({ level }) + : popoutMenuOffset.alignmentAxis) + + const { refs, floatingStyles, context } = useFloating({ + strategy: 'fixed', + open: openWhenCollapsed, + onOpenChange: setOpenWhenCollapsed, + placement: 'right-start', + middleware: [ + offset({ + mainAxis: mainAxisOffset, + alignmentAxis: alignmentAxisOffset + }), + flip({ crossAxis: false }), + shift(), + hide() + ], + whileElementsMounted: autoUpdate + }) + + const hover = useHover(context, { + handleClose: safePolygon({ + blockPointerEvents: true + }), // safePolygon function allows us to reach to submenu + restMs: 25, // Only opens submenu when cursor rests for 25ms on a menu + enabled: triggerPopout === 'hover', // Only enable hover effect when triggerPopout option is set to 'hover' + delay: { open: 75 } // Delay opening submenu by 75ms + }) + + const click = useClick(context, { + enabled: triggerPopout === 'click' // Only enable click effect when triggerPopout option is set to 'click' + }) + + const dismiss = useDismiss(context) + const role = useRole(context, { role: 'menu' }) + + // Merge all the interactions into prop getters + const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([hover, click, dismiss, role]) + + const isSubMenuOpen = openSubmenu?.some((item: OpenSubmenu) => item.id === id) ?? false + + const handleSlideToggle = (): void => { + if (level === 0 && isCollapsed && !isHovered) { + return + } + + toggleOpenSubmenu?.({ level, label, active, id }) + onOpenChange?.(!isSubMenuOpen) + if (openSubmenusRef?.current && openSubmenusRef?.current.length > 0) openSubmenusRef.current = [] + } + + const handleOnClick = (event: MouseEvent) => { + onClick?.(event) + handleSlideToggle() + } + + const handleOnKeyUp = (event: KeyboardEvent) => { + onKeyUp?.(event) + + if (event.key === 'Enter') { + handleSlideToggle() + } + } + + const getSubMenuItemStyles = (element: SubMenuItemElement): CSSObject | undefined => { + // If the menuItemStyles prop is provided, get the styles for the specified element. + if (menuItemStyles) { + // Define the parameters that are passed to the style functions. + const params = { + level, + disabled, + active, + isSubmenu: true, + open: isSubMenuOpen + } + + // Get the style function for the specified element. + const styleFunction = menuItemStyles[element] + + if (styleFunction) { + // If the style function is a function, call it and return the result. + // Otherwise, return the style function itself. + return typeof styleFunction === 'function' ? styleFunction(params) : styleFunction + } + } + } + + // Event emitter allows you to communicate across tree components. + // This effect closes all menus when an item gets clicked anywhere in the tree. + useEffect(() => { + const handleTreeClick = () => { + setOpenWhenCollapsed(false) + } + + tree?.events.on('click', handleTreeClick) + + return () => { + tree?.events.off('click', handleTreeClick) + } + }, [tree]) + + useLayoutEffect(() => { + if (isCollapsed && level === 0) { + setOpenWhenCollapsed(false) + } + }, [isCollapsed, level, active]) + + useEffect(() => { + if (confirmUrlInChildren(children, pathname)) { + openSubmenusRef?.current.push({ level, label, active: true, id }) + } else { + if (defaultOpen) { + openSubmenusRef?.current.push({ level, label, active: false, id }) + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + // Change active state when the url changes + useEffect(() => { + // Check if the current url matches any of the children urls + if (confirmUrlInChildren(children, pathname)) { + setActive(true) + + if (openSubmenusRef?.current.findIndex(submenu => submenu.id === id) === -1) { + openSubmenusRef?.current.push({ level, label, active: true, id }) + } + } else { + setActive(false) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]) + + /* useEffect(() => { + console.log(openSubmenu) + }, [openSubmenu]) */ + + const submenuContent = ( + + {childNodes.map(node => + cloneElement(node, { + ...getItemProps({ + onClick(event: MouseEvent) { + if (node.props.children && !Array.isArray(node.props.children)) { + node.props.onClick?.(event) + tree?.events.emit('click') + } + } + }), + level: level + 1 + }) + )} + + ) + + return ( + // eslint-disable-next-line lines-around-comment + /* Sub Menu */ + + {/* Menu Item */} + + {/* Sub Menu Icon */} + {renderMenuIcon({ + icon, + level, + active, + disabled, + renderExpandedMenuItemIcon, + styles: getSubMenuItemStyles('icon'), + isBreakpointReached + })} + + {/* Sub Menu Prefix */} + {prefix && ( + + {prefix} + + )} + + {/* Sub Menu Label */} + + {label} + + + {/* Sub Menu Suffix */} + {suffix && ( + + {suffix} + + )} + + {/* Sub Menu Toggle Icon Wrapper */} + {isCollapsed && !isHovered && level === 0 ? null : ( + + {renderExpandIcon ? ( + renderExpandIcon({ + level, + disabled, + active, + open: isSubMenuOpen + }) + ) : ( + // eslint-disable-next-line lines-around-comment + /* Expanded Arrow Icon */ + + + + )} + + )} + + + {/* Sub Menu Content */} + {isCollapsed && level === 0 && isPopoutWhenCollapsed ? ( + {openWhenCollapsed && submenuContent} + ) : ( + submenuContent + )} + + ) +} + +export default forwardRef(SubMenu) diff --git a/src/@menu/components/vertical-menu/SubMenuContent.tsx b/src/@menu/components/vertical-menu/SubMenuContent.tsx new file mode 100644 index 0000000..c1d03ea --- /dev/null +++ b/src/@menu/components/vertical-menu/SubMenuContent.tsx @@ -0,0 +1,125 @@ +// React Imports +import { forwardRef, useEffect, useState } from 'react' +import type { ForwardRefRenderFunction, HTMLAttributes, MutableRefObject } from 'react' + +// Third-party Imports +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { VerticalMenuContextProps } from './Menu' +import type { ChildrenType, RootStylesType } from '../../types' + +// Styled Component Imports +import StyledSubMenuContent from '../../styles/StyledSubMenuContent' + +// Style Imports +import styles from '../../styles/styles.module.css' + +export type SubMenuContentProps = HTMLAttributes & + RootStylesType & + Partial & { + open?: boolean + openWhenCollapsed?: boolean + openWhenHovered?: boolean + transitionDuration?: VerticalMenuContextProps['transitionDuration'] + isPopoutWhenCollapsed?: boolean + level?: number + isCollapsed?: boolean + isHovered?: boolean + browserScroll?: boolean + } + +const SubMenuContent: ForwardRefRenderFunction = (props, ref) => { + // Props + const { + children, + open, + level, + isCollapsed, + isHovered, + transitionDuration, + isPopoutWhenCollapsed, + openWhenCollapsed, + browserScroll, + ...rest + } = props + + // States + const [mounted, setMounted] = useState(false) + + // Refs + const SubMenuContentRef = ref as MutableRefObject + + useEffect(() => { + if (mounted) { + if (open || (open && isHovered)) { + const target = SubMenuContentRef?.current + + if (target) { + target.style.display = 'block' + target.style.overflow = 'hidden' + target.style.blockSize = 'auto' + const height = target.offsetHeight + + target.style.blockSize = '0px' + target.offsetHeight + + target.style.blockSize = `${height}px` + + setTimeout(() => { + target.style.overflow = 'auto' + target.style.blockSize = 'auto' + }, transitionDuration) + } + } else { + const target = SubMenuContentRef?.current + + if (target) { + target.style.overflow = 'hidden' + target.style.blockSize = `${target.offsetHeight}px` + target.offsetHeight + target.style.blockSize = '0px' + + setTimeout(() => { + target.style.overflow = 'auto' + target.style.display = 'none' + }, transitionDuration) + } + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open, mounted, SubMenuContentRef]) + + useEffect(() => { + setMounted(true) + }, [isHovered]) + + return ( + + {/* If browserScroll is false render PerfectScrollbar */} + {!browserScroll && level === 0 && isPopoutWhenCollapsed && isCollapsed ? ( + +
    {children}
+
+ ) : ( +
    {children}
+ )} +
+ ) +} + +export default forwardRef(SubMenuContent) diff --git a/src/@menu/components/vertical-menu/VerticalNav.tsx b/src/@menu/components/vertical-menu/VerticalNav.tsx new file mode 100644 index 0000000..fc05bf1 --- /dev/null +++ b/src/@menu/components/vertical-menu/VerticalNav.tsx @@ -0,0 +1,245 @@ +'use client' + +// React Imports +import { useEffect, useRef } from 'react' +import type { HTMLAttributes } from 'react' + +// Third-party Imports +import classnames from 'classnames' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { BreakpointType } from '../../types' + +// Context Imports +import type { VerticalNavState } from '../../contexts/verticalNavContext' + +// Hook Imports +import useMediaQuery from '../../hooks/useMediaQuery' +import useVerticalNav from '../../hooks/useVerticalNav' + +// Util Imports +import { verticalNavClasses } from '../../utils/menuClasses' + +// Styled Component Imports +import StyledBackdrop from '../../styles/StyledBackdrop' +import StyledVerticalNav from '../../styles/vertical/StyledVerticalNav' +import StyledVerticalNavContainer from '../../styles/vertical/StyledVerticalNavContainer' +import StyledVerticalNavBgColorContainer from '../../styles/vertical/StyledVerticalNavBgColorContainer' + +// Style Imports +import styles from '../../styles/vertical/verticalNavBgImage.module.css' + +// Default Config Imports +import { defaultBreakpoints, verticalNavToggleDuration } from '../../defaultConfigs' + +export type VerticalNavProps = HTMLAttributes & { + width?: VerticalNavState['width'] + collapsedWidth?: VerticalNavState['collapsedWidth'] + defaultCollapsed?: boolean + backgroundColor?: string + backgroundImage?: string + breakpoint?: BreakpointType + customBreakpoint?: string + breakpoints?: Partial + transitionDuration?: VerticalNavState['transitionDuration'] + backdropColor?: string + scrollWithContent?: boolean + customStyles?: CSSObject +} + +const VerticalNav = (props: VerticalNavProps) => { + // Props + const { + width = 260, + collapsedWidth = 80, + defaultCollapsed = false, + backgroundColor = 'white', + backgroundImage, + breakpoint = 'lg', + customBreakpoint, + breakpoints, + transitionDuration = verticalNavToggleDuration, + backdropColor, + scrollWithContent = false, + className, + customStyles, + children, + ...rest + } = props + + // Vars + const mergedBreakpoints = { ...defaultBreakpoints, ...breakpoints } + + // Refs + const verticalNavCollapsedRef = useRef(false) + + // Hooks + const { + updateVerticalNavState, + isCollapsed: isCollapsedContext, + width: widthContext, + isBreakpointReached: isBreakpointReachedContext, + isToggled: isToggledContext, + isHovered: isHoveredContext, + collapsing: collapsingContext, + expanding: expandingContext, + isScrollWithContent: isScrollWithContentContext, + transitionDuration: transitionDurationContext, + isPopoutWhenCollapsed: isPopoutWhenCollapsedContext + } = useVerticalNav() + + // Find the breakpoint from which screen size responsive behavior should enable and if its reached or not + const breakpointReached = useMediaQuery(customBreakpoint ?? (breakpoint ? mergedBreakpoints[breakpoint] : breakpoint)) + + // UseEffect, update verticalNav state to set initial values and update values on change + useEffect(() => { + updateVerticalNavState({ + width, + collapsedWidth, + transitionDuration, + isScrollWithContent: scrollWithContent, + isBreakpointReached: breakpointReached + }) + + if (!breakpointReached) { + updateVerticalNavState({ isToggled: false }) + verticalNavCollapsedRef.current && updateVerticalNavState({ isCollapsed: true }) + } else { + if (isCollapsedContext && !verticalNavCollapsedRef.current) { + verticalNavCollapsedRef.current = true + } + + isCollapsedContext && updateVerticalNavState({ isCollapsed: false }) + isHoveredContext && updateVerticalNavState({ isHovered: false }) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [width, collapsedWidth, scrollWithContent, breakpointReached, updateVerticalNavState]) + + useEffect(() => { + if (defaultCollapsed) { + updateVerticalNavState({ + isCollapsed: defaultCollapsed, + isToggled: false + }) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [defaultCollapsed]) + + useEffect(() => { + setTimeout(() => { + updateVerticalNavState({ + expanding: false, + collapsing: false + }) + }, transitionDuration) + + if (!isCollapsedContext && !breakpointReached && verticalNavCollapsedRef.current) { + verticalNavCollapsedRef.current = false + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isCollapsedContext]) + + // Handle Backdrop(Content Overlay) Click + const handleBackdropClick = () => { + // Close the verticalNav + updateVerticalNavState({ isToggled: false }) + } + + // Handle VerticalNav Hover Event + const handleVerticalNavHover = () => { + /* If verticalNav is collapsed then only hover class should be added to verticalNav + and hover functionality should work (expand verticalNav width) */ + if (isCollapsedContext && !isHoveredContext) { + updateVerticalNavState({ isHovered: true }) + } + } + + // Handle VerticalNav Hover Out Event + const handleVerticalNavHoverOut = () => { + // If verticalNav is collapsed then only remove hover class should contract verticalNav width + if (isCollapsedContext && isHoveredContext) { + updateVerticalNavState({ isHovered: false }) + } + } + + return ( + + {/* VerticalNav Container for hover effect when verticalNav is collapsed */} + + {/* VerticalNav Container to apply styling like background */} + + {children} + + + {/* Display verticalNav background image if provided by user through props */} + {backgroundImage && ( + // eslint-disable-next-line lines-around-comment + /* VerticalNav Background Image */ + verticalNav background + )} + + + {/* When verticalNav is toggled on smaller screen, show/hide verticalNav backdrop */} + {isToggledContext && breakpointReached && ( + // eslint-disable-next-line lines-around-comment + /* VerticalNav Backdrop */ + + )} + + ) +} + +export default VerticalNav diff --git a/src/@menu/contexts/horizontalNavContext.tsx b/src/@menu/contexts/horizontalNavContext.tsx new file mode 100644 index 0000000..3769589 --- /dev/null +++ b/src/@menu/contexts/horizontalNavContext.tsx @@ -0,0 +1,37 @@ +'use client' + +// React Imports +import { createContext, useMemo, useState } from 'react' + +// Type Imports +import type { ChildrenType } from '../types' + +export type HorizontalNavContextProps = { + isBreakpointReached?: boolean + updateIsBreakpointReached: (isBreakpointReached: boolean) => void +} + +const HorizontalNavContext = createContext({} as HorizontalNavContextProps) + +export const HorizontalNavProvider = ({ children }: ChildrenType) => { + // States + const [isBreakpointReached, setIsBreakpointReached] = useState(false) + + // update isBreakpointReached value + const updateIsBreakpointReached = (isBreakpointReached: boolean) => { + setIsBreakpointReached(isBreakpointReached) + } + + // Hooks + const HorizontalNavProviderValue = useMemo( + () => ({ + isBreakpointReached, + updateIsBreakpointReached + }), + [isBreakpointReached] + ) + + return {children} +} + +export default HorizontalNavContext diff --git a/src/@menu/contexts/verticalNavContext.tsx b/src/@menu/contexts/verticalNavContext.tsx new file mode 100644 index 0000000..b97e04d --- /dev/null +++ b/src/@menu/contexts/verticalNavContext.tsx @@ -0,0 +1,84 @@ +'use client' + +// React Imports +import { createContext, useCallback, useMemo, useState } from 'react' + +// Type Imports +import type { ChildrenType } from '../types' + +export type VerticalNavState = { + width?: number + collapsedWidth?: number + isCollapsed?: boolean + isHovered?: boolean + isToggled?: boolean + isScrollWithContent?: boolean + isBreakpointReached?: boolean + isPopoutWhenCollapsed?: boolean + collapsing?: boolean // for internal use only + expanding?: boolean // for internal use only + transitionDuration?: number +} + +export type VerticalNavContextProps = VerticalNavState & { + updateVerticalNavState: (values: VerticalNavState) => void + collapseVerticalNav: (value?: VerticalNavState['isCollapsed']) => void + hoverVerticalNav: (value?: VerticalNavState['isHovered']) => void + toggleVerticalNav: (value?: VerticalNavState['isToggled']) => void +} + +const VerticalNavContext = createContext({} as VerticalNavContextProps) + +export const VerticalNavProvider = ({ children }: ChildrenType) => { + // States + const [verticalNavState, setVerticalNavState] = useState() + + // Hooks + const updateVerticalNavState = useCallback((values: Partial) => { + setVerticalNavState(prevState => ({ + ...prevState, + ...values, + collapsing: values.isCollapsed === true, + expanding: values.isCollapsed === false + })) + }, []) + + const collapseVerticalNav = useCallback((value?: boolean) => { + setVerticalNavState(prevState => ({ + ...prevState, + isHovered: value !== undefined && false, + isCollapsed: value !== undefined ? Boolean(value) : !Boolean(prevState?.isCollapsed), + collapsing: value === true, + expanding: value !== true + })) + }, []) + + const hoverVerticalNav = useCallback((value?: boolean) => { + setVerticalNavState(prevState => ({ + ...prevState, + isHovered: value !== undefined ? Boolean(value) : !Boolean(prevState?.isHovered) + })) + }, []) + + const toggleVerticalNav = useCallback((value?: boolean) => { + setVerticalNavState(prevState => ({ + ...prevState, + isToggled: value !== undefined ? Boolean(value) : !Boolean(prevState?.isToggled) + })) + }, []) + + const verticalNavProviderValue = useMemo( + () => ({ + ...verticalNavState, + updateVerticalNavState, + collapseVerticalNav, + hoverVerticalNav, + toggleVerticalNav + }), + [verticalNavState, updateVerticalNavState, collapseVerticalNav, hoverVerticalNav, toggleVerticalNav] + ) + + return {children} +} + +export default VerticalNavContext diff --git a/src/@menu/defaultConfigs.ts b/src/@menu/defaultConfigs.ts new file mode 100644 index 0000000..814f0ec --- /dev/null +++ b/src/@menu/defaultConfigs.ts @@ -0,0 +1,16 @@ +// Type Imports +import type { BreakpointType } from './types' + +export const defaultBreakpoints: Record = { + xs: '480px', + sm: '600px', + md: '900px', + lg: '1200px', + xl: '1536px', + xxl: '1920px', + always: 'always' +} + +export const verticalNavToggleDuration = 300 +export const verticalSubMenuToggleDuration = 300 +export const horizontalSubMenuToggleDuration = 200 diff --git a/src/@menu/hooks/useHorizontalMenu.tsx b/src/@menu/hooks/useHorizontalMenu.tsx new file mode 100644 index 0000000..7d0e301 --- /dev/null +++ b/src/@menu/hooks/useHorizontalMenu.tsx @@ -0,0 +1,22 @@ +// React Imports +import { useContext } from 'react' + +// Type Imports +import type { HorizontalMenuContextProps } from '../components/horizontal-menu/Menu' + +// Context Imports +import { HorizontalMenuContext } from '../components/horizontal-menu/Menu' + +const useHorizontalMenu = (): HorizontalMenuContextProps => { + // Hooks + const context = useContext(HorizontalMenuContext) + + if (context === undefined) { + //TODO: set better error message + throw new Error('Menu Component is required!') + } + + return context +} + +export default useHorizontalMenu diff --git a/src/@menu/hooks/useHorizontalNav.tsx b/src/@menu/hooks/useHorizontalNav.tsx new file mode 100644 index 0000000..d77318b --- /dev/null +++ b/src/@menu/hooks/useHorizontalNav.tsx @@ -0,0 +1,19 @@ +// React Imports +import { useContext } from 'react' + +// Context Imports +import HorizontalNavContext from '../contexts/horizontalNavContext' + +const useHorizontalNav = () => { + // Hooks + const context = useContext(HorizontalNavContext) + + if (context === undefined) { + //TODO: set better error message + throw new Error('HorizontalNav Component is required!') + } + + return context +} + +export default useHorizontalNav diff --git a/src/@menu/hooks/useMediaQuery.tsx b/src/@menu/hooks/useMediaQuery.tsx new file mode 100644 index 0000000..559e839 --- /dev/null +++ b/src/@menu/hooks/useMediaQuery.tsx @@ -0,0 +1,29 @@ +'use client' + +// React Imports +import { useEffect, useState } from 'react' + +const useMediaQuery = (breakpoint?: string): boolean => { + // States + const [matches, setMatches] = useState(breakpoint === 'always') + + useEffect(() => { + if (breakpoint && breakpoint !== 'always') { + const media = window.matchMedia(`(max-width: ${breakpoint})`) + + if (media.matches !== matches) { + setMatches(media.matches) + } + + const listener = () => setMatches(media.matches) + + window.addEventListener('resize', listener) + + return () => window.removeEventListener('resize', listener) + } + }, [matches, breakpoint]) + + return matches +} + +export default useMediaQuery diff --git a/src/@menu/hooks/useVerticalMenu.tsx b/src/@menu/hooks/useVerticalMenu.tsx new file mode 100644 index 0000000..d15849f --- /dev/null +++ b/src/@menu/hooks/useVerticalMenu.tsx @@ -0,0 +1,22 @@ +// React Imports +import { useContext } from 'react' + +// Type Imports +import type { VerticalMenuContextProps } from '../components/vertical-menu/Menu' + +// Context Imports +import { VerticalMenuContext } from '../components/vertical-menu/Menu' + +const useVerticalMenu = (): VerticalMenuContextProps => { + // Hooks + const context = useContext(VerticalMenuContext) + + if (context === undefined) { + //TODO: set better error message + throw new Error('Menu Component is required!') + } + + return context +} + +export default useVerticalMenu diff --git a/src/@menu/hooks/useVerticalNav.tsx b/src/@menu/hooks/useVerticalNav.tsx new file mode 100644 index 0000000..f15fba2 --- /dev/null +++ b/src/@menu/hooks/useVerticalNav.tsx @@ -0,0 +1,19 @@ +// React Imports +import { useContext } from 'react' + +// Context Imports +import VerticalNavContext from '../contexts/verticalNavContext' + +const useVerticalNav = () => { + // Hooks + const context = useContext(VerticalNavContext) + + if (context === undefined) { + //TODO: set better error message + throw new Error('VerticalNav Component is required!') + } + + return context +} + +export default useVerticalNav diff --git a/src/@menu/horizontal-menu/index.tsx b/src/@menu/horizontal-menu/index.tsx new file mode 100644 index 0000000..275d5fe --- /dev/null +++ b/src/@menu/horizontal-menu/index.tsx @@ -0,0 +1,13 @@ +// Import all Horizontal Nav components and export them +import Menu from '../components/horizontal-menu/Menu' +import SubMenu from '../components/horizontal-menu/SubMenu' +import MenuItem from '../components/horizontal-menu/MenuItem' +import HorizontalNav from '../components/horizontal-menu/HorizontalNav' +import type { MenuProps } from '../components/horizontal-menu/Menu' +import type { SubMenuProps } from '../components/horizontal-menu/SubMenu' +import type { MenuItemProps } from '../components/horizontal-menu/MenuItem' +import type { HorizontalNavProps } from '../components/horizontal-menu/HorizontalNav' + +export default HorizontalNav +export { Menu, MenuItem, SubMenu } +export type { HorizontalNavProps, MenuProps, MenuItemProps, SubMenuProps } diff --git a/src/@menu/styles/StyledBackdrop.tsx b/src/@menu/styles/StyledBackdrop.tsx new file mode 100644 index 0000000..a4e94cd --- /dev/null +++ b/src/@menu/styles/StyledBackdrop.tsx @@ -0,0 +1,20 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { VerticalNavProps } from '../vertical-menu' + +type StyledBackdropProps = Pick + +const StyledBackdrop = styled.div` + position: fixed; + inset-inline-start: 0; + inset-block-start: 0; + inset-inline-end: 0; + inset-block-end: 0; + z-index: 1; + background-color: ${({ backdropColor }) => backdropColor || 'rgba(0, 0, 0, 0.3)'}; + touch-action: none; +` + +export default StyledBackdrop diff --git a/src/@menu/styles/StyledMenuIcon.tsx b/src/@menu/styles/StyledMenuIcon.tsx new file mode 100644 index 0000000..efe30ea --- /dev/null +++ b/src/@menu/styles/StyledMenuIcon.tsx @@ -0,0 +1,15 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../types' + +const StyledMenuIcon = styled.span` + display: flex; + align-items: center; + justify-content: center; + margin-inline-end: 10px; + ${({ rootStyles }) => rootStyles}; +` + +export default StyledMenuIcon diff --git a/src/@menu/styles/StyledMenuLabel.tsx b/src/@menu/styles/StyledMenuLabel.tsx new file mode 100644 index 0000000..5d66fd7 --- /dev/null +++ b/src/@menu/styles/StyledMenuLabel.tsx @@ -0,0 +1,23 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../types' + +type StyledMenuLabelProps = RootStylesType & { + textTruncate?: boolean +} + +const StyledMenuLabel = styled.span` + flex-grow: 1; + ${({ textTruncate }) => + textTruncate && + ` + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + `}; + ${({ rootStyles }) => rootStyles}; +` + +export default StyledMenuLabel diff --git a/src/@menu/styles/StyledMenuPrefix.tsx b/src/@menu/styles/StyledMenuPrefix.tsx new file mode 100644 index 0000000..b6ef1a3 --- /dev/null +++ b/src/@menu/styles/StyledMenuPrefix.tsx @@ -0,0 +1,19 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../types' + +type StyledMenuPrefixProps = RootStylesType & { + firstLevel?: boolean + isCollapsed?: boolean + isHovered?: boolean +} + +const StyledMenuPrefix = styled.span` + margin-inline-end: 5px; + display: ${({ firstLevel, isCollapsed, isHovered }) => (firstLevel && isCollapsed && !isHovered ? 'none' : 'flex')}; + ${({ rootStyles }) => rootStyles}; +` + +export default StyledMenuPrefix diff --git a/src/@menu/styles/StyledMenuSectionLabel.tsx b/src/@menu/styles/StyledMenuSectionLabel.tsx new file mode 100644 index 0000000..9642d2c --- /dev/null +++ b/src/@menu/styles/StyledMenuSectionLabel.tsx @@ -0,0 +1,30 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../types' + +type StyledMenuSectionLabelProps = RootStylesType & { + isCollapsed?: boolean + isHovered?: boolean + textTruncate?: boolean +} + +const StyledMenuSectionLabel = styled.span` + ${({ textTruncate }) => + textTruncate && + ` + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `}; + ${({ isCollapsed, isHovered }) => + !isCollapsed || (isCollapsed && isHovered) + ? ` +flex-grow: 1; +` + : ''} + ${({ rootStyles }) => rootStyles}; +` + +export default StyledMenuSectionLabel diff --git a/src/@menu/styles/StyledMenuSuffix.tsx b/src/@menu/styles/StyledMenuSuffix.tsx new file mode 100644 index 0000000..99b6725 --- /dev/null +++ b/src/@menu/styles/StyledMenuSuffix.tsx @@ -0,0 +1,19 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../types' + +type StyledMenuSuffixProps = RootStylesType & { + firstLevel?: boolean + isCollapsed?: boolean + isHovered?: boolean +} + +const StyledMenuSuffix = styled.span` + margin-inline-start: 5px; + display: ${({ firstLevel, isCollapsed, isHovered }) => (firstLevel && isCollapsed && !isHovered ? 'none' : 'flex')}; + ${({ rootStyles }) => rootStyles}; +` + +export default StyledMenuSuffix diff --git a/src/@menu/styles/StyledSubMenuContent.tsx b/src/@menu/styles/StyledSubMenuContent.tsx new file mode 100644 index 0000000..87339a4 --- /dev/null +++ b/src/@menu/styles/StyledSubMenuContent.tsx @@ -0,0 +1,46 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { SubMenuContentProps } from '../components/vertical-menu/SubMenuContent' + +const StyledSubMenuContent = styled.div` + display: none; + overflow: hidden; + z-index: 999; + transition: ${({ transitionDuration }) => `block-size ${transitionDuration}ms ease-in-out`}; + box-sizing: border-box; + + ${({ isCollapsed, level, isPopoutWhenCollapsed, isHovered }) => + isCollapsed && + level === 0 && + !isPopoutWhenCollapsed && + !isHovered && + ` + block-size: 0 !important; + `} + + ${({ isCollapsed, level, isPopoutWhenCollapsed }) => + isCollapsed && level === 0 && isPopoutWhenCollapsed + ? ` + display: block; + padding-inline-start: 0px; + inline-size: 260px; + border-radius: 4px; + block-size: auto !important; + transition: none !important; + background-color: white; + box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d; + ` + : ` + position: static !important; + transform: none !important; + `} + + ${({ browserScroll }) => browserScroll && `overflow-y: auto; max-block-size: calc((var(--vh, 1vh) * 100));`} + + + ${({ rootStyles }) => rootStyles}; +` + +export default StyledSubMenuContent diff --git a/src/@menu/styles/horizontal/StyledHorizontalMenu.tsx b/src/@menu/styles/horizontal/StyledHorizontalMenu.tsx new file mode 100644 index 0000000..f115849 --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalMenu.tsx @@ -0,0 +1,16 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { MenuProps } from '../../components/vertical-menu/Menu' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +const StyledHorizontalMenu = styled.nav>` + &.${menuClasses.root} { + ${({ rootStyles }) => rootStyles} + } +` + +export default StyledHorizontalMenu diff --git a/src/@menu/styles/horizontal/StyledHorizontalMenuItem.tsx b/src/@menu/styles/horizontal/StyledHorizontalMenuItem.tsx new file mode 100644 index 0000000..7ad616c --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalMenuItem.tsx @@ -0,0 +1,36 @@ +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { MenuItemProps } from '../../components/horizontal-menu/MenuItem' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +// Style Imports +import { menuButtonStyles } from '../../components/horizontal-menu/MenuButton' + +type StyledHorizontalMenuItemProps = Pick & { + level: number + menuItemStyles?: CSSObject + buttonStyles?: CSSObject +} + +const StyledHorizontalMenuItem = styled.li` + position: relative; + ${({ level }) => level === 0 && { borderRadius: '6px', overflow: 'hidden' }} + ${({ menuItemStyles }) => menuItemStyles}; + ${({ rootStyles }) => rootStyles}; + + > .${menuClasses.button} { + ${({ level, disabled }) => + menuButtonStyles({ + level, + disabled + })}; + ${({ buttonStyles }) => buttonStyles}; + } +` + +export default StyledHorizontalMenuItem diff --git a/src/@menu/styles/horizontal/StyledHorizontalNav.tsx b/src/@menu/styles/horizontal/StyledHorizontalNav.tsx new file mode 100644 index 0000000..787335a --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalNav.tsx @@ -0,0 +1,14 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { HorizontalNavProps } from '../../components/horizontal-menu/HorizontalNav' + +const StyledHorizontalNav = styled.div>` + inline-size: 100%; + overflow: hidden; + position: relative; + ${({ customStyles }) => customStyles} +` + +export default StyledHorizontalNav diff --git a/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.tsx b/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.tsx new file mode 100644 index 0000000..6134c35 --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalNavExpandIcon.tsx @@ -0,0 +1,40 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../../types' + +type StyledHorizontalNavExpandIconProps = { + level?: number +} + +export const StyledHorizontalNavExpandIconWrapper = styled.span` + display: flex; + margin-inline-start: 5px; + ${({ rootStyles }) => rootStyles}; +` + +const StyledHorizontalNavExpandIcon = styled.span` + display: flex; + + ${({ level }) => + level === 0 && + ` + & > i, + & > svg { + transform: rotate(90deg); + } + `} + + ${({ level }) => + level && + level > 0 && + ` + [dir='rtl'] & > i, + [dir='rtl'] & > svg { + transform: rotate(180deg); + } + `} +` + +export default StyledHorizontalNavExpandIcon diff --git a/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.tsx b/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.tsx new file mode 100644 index 0000000..fdccb46 --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalSubMenuContent.tsx @@ -0,0 +1,21 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { SubMenuContentProps } from '../../components/horizontal-menu/SubMenuContent' + +const StyledHorizontalSubMenuContent = styled.div` + inline-size: 260px; + border-radius: 4px; + box-shadow: 0 9px 28px 8px #00000011; + outline: none; + box-sizing: border-box; + background-color: white; + overflow: hidden; + + ${({ browserScroll, top }) => + browserScroll && `overflow-y: auto; max-block-size: calc((var(--vh, 1vh) * 100) - ${top}px);`} + ${({ rootStyles }) => rootStyles}; +` + +export default StyledHorizontalSubMenuContent diff --git a/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.tsx b/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.tsx new file mode 100644 index 0000000..e29e8d9 --- /dev/null +++ b/src/@menu/styles/horizontal/StyledHorizontalSubMenuContentWrapper.tsx @@ -0,0 +1,13 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../../types' + +const StyledHorizontalSubMenuContentWrapper = styled.div` + z-index: 10; + + ${({ rootStyles }) => rootStyles}; +` + +export default StyledHorizontalSubMenuContentWrapper diff --git a/src/@menu/styles/horizontal/horizontalUl.module.css b/src/@menu/styles/horizontal/horizontalUl.module.css new file mode 100644 index 0000000..ace4a0d --- /dev/null +++ b/src/@menu/styles/horizontal/horizontalUl.module.css @@ -0,0 +1,15 @@ +.root { + list-style-type: none; + display: flex; + flex-wrap: wrap; + align-items: center; + inline-size: 100%; + block-size: 100%; + overflow: hidden; + position: relative; + padding: 0; + margin: 0; + .li:not(:last-of-type) { + margin-inline-end: 4px; + } +} diff --git a/src/@menu/styles/styles.module.css b/src/@menu/styles/styles.module.css new file mode 100644 index 0000000..729a589 --- /dev/null +++ b/src/@menu/styles/styles.module.css @@ -0,0 +1,5 @@ +.ul { + list-style-type: none; + padding: 0; + margin: 0; +} diff --git a/src/@menu/styles/vertical/StyledVerticalMenu.tsx b/src/@menu/styles/vertical/StyledVerticalMenu.tsx new file mode 100644 index 0000000..ca3977d --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalMenu.tsx @@ -0,0 +1,19 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { MenuProps } from '../../components/vertical-menu/Menu' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +const StyledVerticalMenu = styled.nav>` + & > ul > :first-of-type { + margin-block-start: 0; + } + &.${menuClasses.root} { + ${({ rootStyles }) => rootStyles} + } +` + +export default StyledVerticalMenu diff --git a/src/@menu/styles/vertical/StyledVerticalMenuItem.tsx b/src/@menu/styles/vertical/StyledVerticalMenuItem.tsx new file mode 100644 index 0000000..0293e89 --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalMenuItem.tsx @@ -0,0 +1,40 @@ +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { MenuItemProps } from '../../components/vertical-menu/MenuItem' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +// Style Imports +import { menuButtonStyles } from '../../components/vertical-menu/MenuButton' + +type StyledVerticalMenuItemProps = Pick & { + level: number + menuItemStyles?: CSSObject + isCollapsed?: boolean + isPopoutWhenCollapsed?: boolean + buttonStyles?: CSSObject +} + +const StyledVerticalMenuItem = styled.li` + position: relative; + margin-block-start: 4px; + ${({ menuItemStyles }) => menuItemStyles}; + ${({ rootStyles }) => rootStyles}; + + > .${menuClasses.button} { + ${({ level, disabled, isCollapsed, isPopoutWhenCollapsed }) => + menuButtonStyles({ + level, + disabled, + isCollapsed, + isPopoutWhenCollapsed + })}; + ${({ buttonStyles }) => buttonStyles}; + } +` + +export default StyledVerticalMenuItem diff --git a/src/@menu/styles/vertical/StyledVerticalMenuSection.tsx b/src/@menu/styles/vertical/StyledVerticalMenuSection.tsx new file mode 100644 index 0000000..378c73c --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalMenuSection.tsx @@ -0,0 +1,31 @@ +// Third-party Imports +import styled from '@emotion/styled' +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { MenuSectionProps } from '../../components/vertical-menu/MenuSection' + +// Util Imports +import { menuClasses } from '../../utils/menuClasses' + +type StyledVerticalMenuSectionProps = Pick & { + menuSectionStyles?: CSSObject +} + +const StyledVerticalMenuSection = styled.li` + display: flex; + inline-size: 100%; + position: relative; + overflow: hidden; + margin-block-start: 15px; + + & .${menuClasses.menuSectionContent} { + font-size: 14px; + color: #aaaaaa; + } + + ${({ menuSectionStyles }) => menuSectionStyles}; + ${({ rootStyles }) => rootStyles}; +` + +export default StyledVerticalMenuSection diff --git a/src/@menu/styles/vertical/StyledVerticalNav.tsx b/src/@menu/styles/vertical/StyledVerticalNav.tsx new file mode 100644 index 0000000..0313ea3 --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalNav.tsx @@ -0,0 +1,74 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { VerticalNavState } from '../../contexts/verticalNavContext' +import type { VerticalNavProps } from '../../components/vertical-menu/VerticalNav' + +// Util Imports +import { horizontalNavClasses, menuClasses, verticalNavClasses } from '../../utils/menuClasses' + +type StyledVerticalNavProps = VerticalNavProps & + Pick + +const StyledVerticalNav = styled.aside` + ${({ scrollWithContent }) => + !scrollWithContent && + ` + position: sticky; + inset-block-start: 0; + block-size: 100dvh; + `} + z-index: 9; + + /* Transition */ + transition-property: inline-size, min-inline-size, margin-inline-start, inset-inline-start; + transition-duration: ${({ transitionDuration }) => `${transitionDuration}ms`}; + transition-timing-function: ease-in-out; + + /* Width & Min Width & Margin */ + inline-size: ${({ width }) => `${width}px`}; + min-inline-size: ${({ width }) => `${width}px`}; + &.${verticalNavClasses.collapsed} { + inline-size: ${({ collapsedWidth }) => `${collapsedWidth}px`}; + min-inline-size: ${({ collapsedWidth }) => `${collapsedWidth}px`}; + } + + &.${verticalNavClasses.collapsing}, &.${verticalNavClasses.expanding} { + pointer-events: none; + } + + /* Collapsed & Toggled */ + &.${verticalNavClasses.breakpointReached} { + position: fixed; + block-size: 100%; + inset-block-start: 0; + inset-inline-start: ${({ width }) => `-${width}px`}; + z-index: 100; + margin: 0; + &.${verticalNavClasses.collapsed} { + inset-inline-start: -${({ collapsedWidth }) => `${collapsedWidth}px`}; + } + &.${verticalNavClasses.toggled} { + inset-inline-start: 0; + } + } + + ${({ width, isBreakpointReached }) => + !isBreakpointReached && + ` + &.${verticalNavClasses.toggled} { + margin-inline-start: -${width}px; + } + `} + + &.${horizontalNavClasses.root} .${menuClasses.root} > ul { + flex-direction: column; + align-items: stretch; + } + + /* User Styles */ + ${({ customStyles }) => customStyles} +` + +export default StyledVerticalNav diff --git a/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.tsx b/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.tsx new file mode 100644 index 0000000..60f9552 --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalNavBgColorContainer.tsx @@ -0,0 +1,20 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { VerticalNavProps } from '../../components/vertical-menu/VerticalNav' + +type StyledVerticalNavBgColorContainerProps = Pick + +const StyledVerticalNavBgColorContainer = styled.div` + position: relative; + block-size: 100%; + z-index: 3; + display: flex; + flex-direction: column; + overflow-y: auto; + overflow-x: hidden; + ${({ backgroundColor }) => backgroundColor && `background-color:${backgroundColor};`} +` + +export default StyledVerticalNavBgColorContainer diff --git a/src/@menu/styles/vertical/StyledVerticalNavContainer.tsx b/src/@menu/styles/vertical/StyledVerticalNavContainer.tsx new file mode 100644 index 0000000..b47464b --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalNavContainer.tsx @@ -0,0 +1,28 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { VerticalNavProps } from '../../components/vertical-menu/VerticalNav' + +// Util Imports +import { verticalNavClasses } from '../../utils/menuClasses' + +type StyledVerticalNavContainerProps = Pick + +const StyledVerticalNavContainer = styled.div` + position: relative; + block-size: 100%; + inline-size: 100%; + border-inline-end: 1px solid #efefef; + .${verticalNavClasses.hovered} &, + .${verticalNavClasses.expanding} & { + inline-size: ${({ width }) => `${width}px`}; + } + + /* Transition */ + transition-property: inline-size, inset-inline-start; + transition-duration: ${({ transitionDuration }) => `${transitionDuration}ms`}; + transition-timing-function: ease-in-out; +` + +export default StyledVerticalNavContainer diff --git a/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.tsx b/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.tsx new file mode 100644 index 0000000..46d610c --- /dev/null +++ b/src/@menu/styles/vertical/StyledVerticalNavExpandIcon.tsx @@ -0,0 +1,34 @@ +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { RootStylesType } from '../../types' +import type { VerticalMenuContextProps } from '../../components/vertical-menu/Menu' + +type StyledVerticalNavExpandIconProps = { + open?: boolean + transitionDuration?: VerticalMenuContextProps['transitionDuration'] +} + +export const StyledVerticalNavExpandIconWrapper = styled.span` + display: flex; + margin-inline-start: 5px; + ${({ rootStyles }) => rootStyles}; +` + +const StyledVerticalNavExpandIcon = styled.span` + display: flex; + + & > i, + & > svg { + transition: ${({ transitionDuration }) => `transform ${transitionDuration}ms ease-in-out`}; + ${({ open }) => open && 'transform: rotate(90deg);'} + + [dir='rtl'] & { + transform: rotate(180deg); + ${({ open }) => open && 'transform: rotate(90deg);'} + } + } +` + +export default StyledVerticalNavExpandIcon diff --git a/src/@menu/styles/vertical/verticalNavBgImage.module.css b/src/@menu/styles/vertical/verticalNavBgImage.module.css new file mode 100644 index 0000000..c1472e1 --- /dev/null +++ b/src/@menu/styles/vertical/verticalNavBgImage.module.css @@ -0,0 +1,10 @@ +.root { + inline-size: 100%; + block-size: 100%; + position: absolute; + inset-block-start: 0; + inset-inline-start: 0; + object-fit: cover; + object-position: center; + z-index: 2; +} diff --git a/src/@menu/svg/ChevronRight.tsx b/src/@menu/svg/ChevronRight.tsx new file mode 100644 index 0000000..33182c6 --- /dev/null +++ b/src/@menu/svg/ChevronRight.tsx @@ -0,0 +1,12 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const ChevronRight = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default ChevronRight diff --git a/src/@menu/svg/Close.tsx b/src/@menu/svg/Close.tsx new file mode 100644 index 0000000..324eec4 --- /dev/null +++ b/src/@menu/svg/Close.tsx @@ -0,0 +1,15 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Close = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default Close diff --git a/src/@menu/svg/RadioCircle.tsx b/src/@menu/svg/RadioCircle.tsx new file mode 100644 index 0000000..c7f4017 --- /dev/null +++ b/src/@menu/svg/RadioCircle.tsx @@ -0,0 +1,15 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const RadioCircle = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default RadioCircle diff --git a/src/@menu/svg/RadioCircleMarked.tsx b/src/@menu/svg/RadioCircleMarked.tsx new file mode 100644 index 0000000..edc5962 --- /dev/null +++ b/src/@menu/svg/RadioCircleMarked.tsx @@ -0,0 +1,16 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const RadioCircleMarked = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default RadioCircleMarked diff --git a/src/@menu/types.ts b/src/@menu/types.ts new file mode 100644 index 0000000..2336b19 --- /dev/null +++ b/src/@menu/types.ts @@ -0,0 +1,95 @@ +// React Imports +import type { AnchorHTMLAttributes, ReactElement, ReactNode } from 'react' + +// Third-party Imports +import type { CSSObject } from '@emotion/styled' + +export type ChildrenType = { + children: ReactNode +} + +// Breakpoints +export type BreakpointType = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'always' + +// Exact match for active URL in menu item +export type MenuItemExactMatchUrlProps = + | { + exactMatch: true + activeUrl?: never + } + | { + exactMatch: false + activeUrl: string + } + | { + exactMatch?: never + activeUrl?: never + } + +// Menu Item Elements for styling +export type MenuItemElement = 'root' | 'button' | 'icon' | 'label' | 'prefix' | 'suffix' + +// Sub Menu Item Elements for styling +export type SubMenuItemElement = + | 'root' + | 'button' + | 'label' + | 'prefix' + | 'suffix' + | 'icon' + | 'subMenuStyles' + | 'subMenuContent' + | 'subMenuExpandIcon' + +// Menu Button Props +export type MenuButtonProps = Omit, 'prefix'> & + Partial & { + component?: string | ReactElement + } + +// Menu Item Styles Params Type +export type MenuItemStylesParams = { + level: number + disabled: boolean + active?: boolean + isSubmenu: boolean + open?: boolean +} + +// Menu Item Style Elements Type +export type ElementStyles = CSSObject | ((params: MenuItemStylesParams) => CSSObject | undefined) + +// Menu Item Styles Type +export type MenuItemStyles = { + root?: ElementStyles + button?: ElementStyles + label?: ElementStyles + prefix?: ElementStyles + suffix?: ElementStyles + icon?: ElementStyles + subMenuStyles?: ElementStyles + subMenuContent?: ElementStyles + subMenuExpandIcon?: ElementStyles +} + +// Expand Icon +export type RenderExpandIconParams = { + open: boolean + level: number + active: boolean + disabled: boolean +} + +// Icon for menu items in expanded submenu +export type RenderExpandedMenuItemIcon = { + icon: + | ReactElement + | ((params: { level?: number; active?: boolean; disabled?: boolean }) => ReactElement | null) + | null + level?: number +} + +// Root Styles +export type RootStylesType = { + rootStyles?: CSSObject +} diff --git a/src/@menu/utils/menuClasses.ts b/src/@menu/utils/menuClasses.ts new file mode 100644 index 0000000..4228589 --- /dev/null +++ b/src/@menu/utils/menuClasses.ts @@ -0,0 +1,44 @@ +// Common classes for menu components +export const menuClasses = { + root: 'ts-menu-root', + menuSectionRoot: 'ts-menusection-root', + menuItemRoot: 'ts-menuitem-root', + subMenuRoot: 'ts-submenu-root', + button: 'ts-menu-button', + prefix: 'ts-menu-prefix', + suffix: 'ts-menu-suffix', + label: 'ts-menu-label', + icon: 'ts-menu-icon', + menuSectionWrapper: 'ts-menu-section-wrapper', + menuSectionContent: 'ts-menu-section-content', + menuSectionLabel: 'ts-menu-section-label', + subMenuContent: 'ts-submenu-content', + subMenuExpandIcon: 'ts-submenu-expand-icon', + disabled: 'ts-disabled', + active: 'ts-active', + open: 'ts-open' +} + +// Classes for vertical navigation menu +export const verticalNavClasses = { + root: 'ts-vertical-nav-root', + container: 'ts-vertical-nav-container', + bgColorContainer: 'ts-vertical-nav-bg-color-container', + header: 'ts-vertical-nav-header', + image: 'ts-vertical-nav-image', + backdrop: 'ts-vertical-nav-backdrop', + collapsed: 'ts-collapsed', + toggled: 'ts-toggled', + hovered: 'ts-hovered', + scrollWithContent: 'ts-scroll-with-content', + breakpointReached: 'ts-breakpoint-reached', + collapsing: 'ts-collapsing', + expanding: 'ts-expanding' +} + +// Classes for horizontal navigation menu +export const horizontalNavClasses = { + root: 'ts-horizontal-nav-root', + scrollWithContent: 'ts-scroll-with-content', + breakpointReached: 'ts-breakpoint-reached' +} diff --git a/src/@menu/utils/menuUtils.tsx b/src/@menu/utils/menuUtils.tsx new file mode 100644 index 0000000..cd0e049 --- /dev/null +++ b/src/@menu/utils/menuUtils.tsx @@ -0,0 +1,163 @@ +// React Imports +import { Children, isValidElement } from 'react' +import type { ReactElement, ReactNode } from 'react' + +// Third-party Imports +import type { CSSObject } from '@emotion/styled' + +// Type Imports +import type { ChildrenType, RenderExpandedMenuItemIcon } from '../types' + +// Component Imports +import { + SubMenu as HorizontalSubMenu, + MenuItem as HorizontalMenuItem, + Menu as HorizontalMenu +} from '../horizontal-menu' +import { SubMenu as VerticalSubMenu, MenuItem as VerticalMenuItem, Menu as VerticalMenu } from '../vertical-menu' +import { GenerateVerticalMenu } from '@components/GenerateMenu' + +// Util Imports +import { menuClasses } from './menuClasses' + +// Styled Component Imports +import StyledMenuIcon from '../styles/StyledMenuIcon' + +type RenderMenuIconParams = { + level?: number + active?: boolean + disabled?: boolean + styles?: CSSObject + icon?: ReactElement + renderExpandedMenuItemIcon?: RenderExpandedMenuItemIcon + isBreakpointReached?: boolean +} + +export const confirmUrlInChildren = (children: ChildrenType['children'], url: string): boolean => { + if (!children) { + return false + } + + if (Array.isArray(children)) { + return children.some((child: ReactNode) => confirmUrlInChildren(child, url)) + } + + if (isValidElement(children)) { + const { component, href, exactMatch, activeUrl, children: subChildren } = children.props + + if (component && component.props.href) { + return exactMatch === true || exactMatch === undefined + ? component.props.href === url + : activeUrl && url.includes(activeUrl) + } + + if (href) { + return exactMatch === true || exactMatch === undefined ? href === url : activeUrl && url.includes(activeUrl) + } + + if (subChildren) { + return confirmUrlInChildren(subChildren, url) + } + } + + return false +} + +/* + * Reason behind mapping the children of the horizontal-menu component to the vertical-menu component: + * The Horizontal menu components will not work inside of Vertical menu on small screens. + * So, we have to map the children of the horizontal-menu components to the vertical-menu components. + * We also kept the same names and almost similar props for menuitem and submenu components for easy mapping. + */ + +/** + * Processes children of a HorizontalMenu component to either generate a vertical menu directly + * from menuData or apply a transformation function to each child. + * + * @param {ReactNode} children - The children of the HorizontalMenu component. + * @param {Function} mapFunction - A function to transform each child that doesn't have menuData. + * @returns {ReactNode} The processed children suitable for inclusion in a VerticalMenu. + */ +const processMenuChildren = (children: ReactNode, mapFunction: (child: ReactNode) => ReactNode): ReactNode => { + return Children.map(children, child => { + // Skip processing for non-React elements + if (!isValidElement(child)) return child + + // If child has menuData prop, create a GenerateVerticalMenu component + // Otherwise, apply the transformation function to the child + return child.props?.menuData ? : mapFunction(child) + }) +} + +/** + * Transforms a hierarchy of horizontal menu components (HorizontalMenuItem, + * HorizontalSubMenu, and HorizontalMenu) into their vertical equivalents. + * + * @param {ReactNode} children - The children of the menu to be transformed. + * @returns {ReactNode} The transformed menu as a hierarchy of vertical menu components. + */ +export const mapHorizontalToVerticalMenu = (children: ReactNode): ReactNode => { + return Children.map(children, child => { + // If the child is not a valid React element, exclude it from the output + if (!isValidElement(child)) return null + + // Destructure to separate specific props and rest props for further use + const { children: childChildren, verticalMenuProps, ...rest } = child.props + + // Use a switch statement to handle different types of menu items + switch (child.type) { + case HorizontalMenuItem: + // Directly transform HorizontalMenuItem to VerticalMenuItem + return {childChildren} + case HorizontalSubMenu: + // Transform HorizontalSubMenu to VerticalSubMenu, recursively transforming its children + return {mapHorizontalToVerticalMenu(childChildren)} + case HorizontalMenu: + // For HorizontalMenu, process its children specifically, then wrap in VerticalMenu + const transformedChildren = processMenuChildren(childChildren, mapHorizontalToVerticalMenu) + + return {transformedChildren} + default: + // For any other type of child, return it without modification + return child + } + }) +} + +/* + * Render all the icons for Menu Item and SubMenu components for all the levels more than 0 + */ +export const renderMenuIcon = (params: RenderMenuIconParams) => { + const { icon, level, active, disabled, styles, renderExpandedMenuItemIcon, isBreakpointReached } = params + + if (icon && (level === 0 || (!isBreakpointReached && level && level > 0))) { + return ( + + {icon} + + ) + } + + if ( + level && + level !== 0 && + renderExpandedMenuItemIcon && + renderExpandedMenuItemIcon.icon !== null && + (!renderExpandedMenuItemIcon.level || renderExpandedMenuItemIcon.level >= level) + ) { + const iconToRender = + typeof renderExpandedMenuItemIcon.icon === 'function' + ? renderExpandedMenuItemIcon.icon({ level, active, disabled }) + : renderExpandedMenuItemIcon.icon + + if (iconToRender) { + return ( + + {iconToRender} + + ) + } + } + + return null +} diff --git a/src/@menu/vertical-menu/index.tsx b/src/@menu/vertical-menu/index.tsx new file mode 100644 index 0000000..0f693da --- /dev/null +++ b/src/@menu/vertical-menu/index.tsx @@ -0,0 +1,17 @@ +// Import all Vertical Nav components and export them +import Menu from '../components/vertical-menu/Menu' +import SubMenu from '../components/vertical-menu/SubMenu' +import MenuItem from '../components/vertical-menu/MenuItem' +import NavHeader from '../components/vertical-menu/NavHeader' +import VerticalNav from '../components/vertical-menu/VerticalNav' +import MenuSection from '../components/vertical-menu/MenuSection' +import NavCollapseIcons from '../components/vertical-menu/NavCollapseIcons' +import type { MenuProps } from '../components/vertical-menu/Menu' +import type { SubMenuProps } from '../components/vertical-menu/SubMenu' +import type { MenuItemProps } from '../components/vertical-menu/MenuItem' +import type { MenuSectionProps } from '../components/vertical-menu/MenuSection' +import type { VerticalNavProps } from '../components/vertical-menu/VerticalNav' + +export default VerticalNav +export { Menu, MenuItem, SubMenu, MenuSection, NavHeader, NavCollapseIcons } +export type { VerticalNavProps, MenuProps, MenuItemProps, SubMenuProps, MenuSectionProps } diff --git a/src/app/[lang]/(blank-layout-pages)/(guest-only)/forgot-password/page.tsx b/src/app/[lang]/(blank-layout-pages)/(guest-only)/forgot-password/page.tsx new file mode 100644 index 0000000..30bc08a --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/(guest-only)/forgot-password/page.tsx @@ -0,0 +1,22 @@ +// Next Imports +import type { Metadata } from 'next' + +// Component Imports +import ForgotPassword from '@views/ForgotPassword' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +export const metadata: Metadata = { + title: 'Forgot Password', + description: 'Forgotten Password to your account' +} + +const ForgotPasswordPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default ForgotPasswordPage diff --git a/src/app/[lang]/(blank-layout-pages)/(guest-only)/layout.tsx b/src/app/[lang]/(blank-layout-pages)/(guest-only)/layout.tsx new file mode 100644 index 0000000..66d3b63 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/(guest-only)/layout.tsx @@ -0,0 +1,16 @@ +// Type Imports +import type { ChildrenType } from '@core/types' +import type { Locale } from '@configs/i18n' + +// HOC Imports +import GuestOnlyRoute from '@/hocs/GuestOnlyRoute' + +const Layout = async (props: ChildrenType & { params: Promise<{ lang: Locale }> }) => { + const params = await props.params + + const { children } = props + + return {children} +} + +export default Layout diff --git a/src/app/[lang]/(blank-layout-pages)/(guest-only)/login/page.tsx b/src/app/[lang]/(blank-layout-pages)/(guest-only)/login/page.tsx new file mode 100644 index 0000000..68331f0 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/(guest-only)/login/page.tsx @@ -0,0 +1,22 @@ +// Next Imports +import type { Metadata } from 'next' + +// Component Imports +import Login from '@views/Login' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +export const metadata: Metadata = { + title: 'Login', + description: 'Login to your account' +} + +const LoginPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default LoginPage diff --git a/src/app/[lang]/(blank-layout-pages)/(guest-only)/register/page.tsx b/src/app/[lang]/(blank-layout-pages)/(guest-only)/register/page.tsx new file mode 100644 index 0000000..87e9f49 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/(guest-only)/register/page.tsx @@ -0,0 +1,22 @@ +// Next Imports +import type { Metadata } from 'next' + +// Component Imports +import Register from '@views/Register' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +export const metadata: Metadata = { + title: 'Register', + description: 'Register to your account' +} + +const RegisterPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default RegisterPage diff --git a/src/app/[lang]/(blank-layout-pages)/layout.tsx b/src/app/[lang]/(blank-layout-pages)/layout.tsx new file mode 100644 index 0000000..2b2844e --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/layout.tsx @@ -0,0 +1,34 @@ +// Type Imports +import type { ChildrenType } from '@core/types' +import type { Locale } from '@configs/i18n' + +// Component Imports +import Providers from '@components/Providers' +import BlankLayout from '@layouts/BlankLayout' + +// Config Imports +import { i18n } from '@configs/i18n' + +// Util Imports +import { getSystemMode } from '@core/utils/serverHelpers' + +type Props = ChildrenType & { + params: Promise<{ lang: Locale }> +} + +const Layout = async (props: Props) => { + const params = await props.params + const { children } = props + + // Vars + const direction = i18n.langDirection[params.lang] + const systemMode = await getSystemMode() + + return ( + + {children} + + ) +} + +export default Layout diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v1/page.tsx new file mode 100644 index 0000000..250e647 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import ForgotPasswordV1 from '@views/pages/auth/ForgotPasswordV1' + +const ForgotPasswordV1Page = () => { + return ( +
+ +
+ ) +} + +export default ForgotPasswordV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v2/page.tsx new file mode 100644 index 0000000..30c632c --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/forgot-password-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import ForgotPasswordV2 from '@views/pages/auth/ForgotPasswordV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const ForgotPasswordV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default ForgotPasswordV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v1/page.tsx new file mode 100644 index 0000000..283b3e8 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import LoginV1 from '@views/pages/auth/LoginV1' + +const LoginV1Page = () => { + return ( +
+ +
+ ) +} + +export default LoginV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v2/page.tsx new file mode 100644 index 0000000..5d44fa0 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/login-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import LoginV2 from '@views/pages/auth/LoginV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const LoginV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default LoginV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/register-multi-steps/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-multi-steps/page.tsx new file mode 100644 index 0000000..1cb35f3 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-multi-steps/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import RegisterMultiSteps from '@views/pages/auth/register-multi-steps' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const RegisterMultiStepsPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default RegisterMultiStepsPage diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v1/page.tsx new file mode 100644 index 0000000..3608a5e --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import RegisterV1 from '@views/pages/auth/RegisterV1' + +const RegisterV1Page = () => { + return ( +
+ +
+ ) +} + +export default RegisterV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v2/page.tsx new file mode 100644 index 0000000..8a427eb --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/register-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import RegisterV2 from '@views/pages/auth/RegisterV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const RegisterV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default RegisterV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v1/page.tsx new file mode 100644 index 0000000..d9c10b0 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import ResetPasswordV1 from '@views/pages/auth/ResetPasswordV1' + +const ResetPasswordV1Page = () => { + return ( +
+ +
+ ) +} + +export default ResetPasswordV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v2/page.tsx new file mode 100644 index 0000000..4f6f8a2 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/reset-password-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import ResetPasswordV2 from '@views/pages/auth/ResetPasswordV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const ResetPasswordV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default ResetPasswordV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v1/page.tsx new file mode 100644 index 0000000..d8ea4b8 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import TwoStepsV1 from '@views/pages/auth/TwoStepsV1' + +const TwoStepsV1Page = () => { + return ( +
+ +
+ ) +} + +export default TwoStepsV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v2/page.tsx new file mode 100644 index 0000000..43b90fc --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/two-steps-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import TwoStepsV2 from '@views/pages/auth/TwoStepsV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const TwoStepsV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default TwoStepsV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v1/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v1/page.tsx new file mode 100644 index 0000000..ae0b4e3 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v1/page.tsx @@ -0,0 +1,12 @@ +// Component Imports +import VerifyEmailV1 from '@views/pages/auth/VerifyEmailV1' + +const VerifyEmailV1Page = () => { + return ( +
+ +
+ ) +} + +export default VerifyEmailV1Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v2/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v2/page.tsx new file mode 100644 index 0000000..cf57222 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/auth/verify-email-v2/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import VerifyEmailV2 from '@views/pages/auth/VerifyEmailV2' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const VerifyEmailV2Page = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default VerifyEmailV2Page diff --git a/src/app/[lang]/(blank-layout-pages)/pages/misc/401-not-authorized/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/misc/401-not-authorized/page.tsx new file mode 100644 index 0000000..14138f7 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/misc/401-not-authorized/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import NotAuthorized from '@views/NotAuthorized' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const Error401 = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default Error401 diff --git a/src/app/[lang]/(blank-layout-pages)/pages/misc/404-not-found/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/misc/404-not-found/page.tsx new file mode 100644 index 0000000..06bb79c --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/misc/404-not-found/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import NotFound from '@views/NotFound' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const Error = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default Error diff --git a/src/app/[lang]/(blank-layout-pages)/pages/misc/coming-soon/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/misc/coming-soon/page.tsx new file mode 100644 index 0000000..904cf9b --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/misc/coming-soon/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import ComingSoon from '@views/pages/misc/ComingSoon' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const ComingSoonPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default ComingSoonPage diff --git a/src/app/[lang]/(blank-layout-pages)/pages/misc/under-maintenance/page.tsx b/src/app/[lang]/(blank-layout-pages)/pages/misc/under-maintenance/page.tsx new file mode 100644 index 0000000..4912d18 --- /dev/null +++ b/src/app/[lang]/(blank-layout-pages)/pages/misc/under-maintenance/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import UnderMaintenance from '@views/pages/misc/UnderMaintenance' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const UnderMaintenancePage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default UnderMaintenancePage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/academy/course-details/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/academy/course-details/page.tsx new file mode 100644 index 0000000..e315b2b --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/academy/course-details/page.tsx @@ -0,0 +1,47 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import Details from '@views/apps/academy/course-details/Details' +import Sidebar from '@views/apps/academy/course-details/Sidebar' + +// Data Imports +import { getAcademyData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getAcademyData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/academy`) + + if (!res.ok) { + throw new Error('Failed to fetch academy data') + } + + return res.json() +} */ + +const CourseDetailsPage = async () => { + // Vars + const data = await getAcademyData() + + return ( + + +
+ + +
+ +
+
+ + ) +} + +export default CourseDetailsPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/academy/dashboard/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/academy/dashboard/page.tsx new file mode 100644 index 0000000..3bc353e --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/academy/dashboard/page.tsx @@ -0,0 +1,65 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import WelcomeCard from '@views/apps/academy/dashboard/WelcomeCard' +import InterestedTopics from '@views/apps/academy/dashboard/InterestedTopics' +import PopularInstructors from '@views/apps/academy/dashboard/PopularInstructors' +import TopCourses from '@views/apps/academy/dashboard/TopCourses' +import UpcomingWebinar from '@views/apps/academy/dashboard/UpcomingWebinar' +import AssignmentProgress from '@views/apps/academy/dashboard/AssignmentProgress' +import CourseTable from '@views/apps/academy/dashboard/CourseTable' + +// Data Imports +import { getAcademyData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getAcademyData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/academy`) + + if (!res.ok) { + throw new Error('Failed to fetch academy data') + } + + return res.json() +} */ + +const AcademyDashboard = async () => { + // Vars + const data = await getAcademyData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default AcademyDashboard diff --git a/src/app/[lang]/(dashboard)/(private)/apps/academy/my-courses/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/academy/my-courses/page.tsx new file mode 100644 index 0000000..e1330cd --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/academy/my-courses/page.tsx @@ -0,0 +1,36 @@ +// Component Imports +import AcademyMyCourse from '@/views/apps/academy/my-courses' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +// Data Imports +import { getAcademyData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/academy` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getAcademyData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/academy`) + + if (!res.ok) { + throw new Error('Failed to fetch academy data') + } + + return res.json() +} */ + +const MyCoursePage = async () => { + // Vars + const mode = await getServerMode() + const data = await getAcademyData() + + return +} + +export default MyCoursePage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/calendar/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/calendar/page.tsx new file mode 100644 index 0000000..d7f34c7 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/calendar/page.tsx @@ -0,0 +1,20 @@ +// MUI Imports +import Card from '@mui/material/Card' + +// Component Imports +import CalendarWrapper from '@views/apps/calendar/CalendarWrapper' + +// Styled Component Imports +import AppFullCalendar from '@/libs/styles/AppFullCalendar' + +const CalendarApp = () => { + return ( + + + + + + ) +} + +export default CalendarApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/chat/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/chat/page.tsx new file mode 100644 index 0000000..9788b62 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/chat/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import ChatWrapper from '@views/apps/chat' + +const ChatApp = () => { + return +} + +export default ChatApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/details/[id]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/details/[id]/page.tsx new file mode 100644 index 0000000..edd62c1 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/details/[id]/page.tsx @@ -0,0 +1,46 @@ +// Next Imports +import { redirect } from 'next/navigation' + +// Type Imports +import type { Customer } from '@/types/apps/ecommerceTypes' + +// Component Imports +import CustomerDetails from '@/views/apps/ecommerce/customers/details' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const CustomerDetailsPage = async (props: { params: Promise<{ id: string }> }) => { + const params = await props.params + + // Vars + const data = await getEcommerceData() + + const filteredData = data?.customerData.filter((item: Customer) => item.customerId === params.id)[0] + + if (!filteredData) { + redirect('/not-found') + } + + return filteredData ? : null +} + +export default CustomerDetailsPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/list/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/list/page.tsx new file mode 100644 index 0000000..992277f --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/customers/list/page.tsx @@ -0,0 +1,31 @@ +import CustomerListTable from '@views/apps/ecommerce/customers/list/CustomerListTable' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const CustomerListTablePage = async () => { + // Vars + const data = await getEcommerceData() + + return +} + +export default CustomerListTablePage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/dashboard/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/dashboard/page.tsx new file mode 100644 index 0000000..9476a52 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/dashboard/page.tsx @@ -0,0 +1,86 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Components Imports +import CongratulationsJohn from '@views/apps/ecommerce/dashboard/Congratulations' +import StatisticsCard from '@views/apps/ecommerce/dashboard/StatisticsCard' +import LineChartProfit from '@views/apps/ecommerce/dashboard/LineChartProfit' +import RadialBarChart from '@views/apps/ecommerce/dashboard/RadialBarChart' +import DonutChartGeneratedLeads from '@views/apps/ecommerce/dashboard/DonutChartGeneratedLeads' +import RevenueReport from '@views/apps/ecommerce/dashboard/RevenueReport' +import EarningReports from '@views/apps/ecommerce/dashboard/EarningReports' +import PopularProducts from '@views/apps/ecommerce/dashboard/PopularProducts' +import Orders from '@views/apps/ecommerce/dashboard/Orders' +import Transactions from '@views/apps/ecommerce/dashboard/Transactions' +import InvoiceListTable from '@views/apps/ecommerce/dashboard/InvoiceListTable' + +// Data Imports +import { getInvoiceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getInvoiceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/invoice`) + + if (!res.ok) { + throw new Error('Failed to fetch invoice data') + } + + return res.json() +} + */ + +const EcommerceDashboard = async () => { + // Vars + const invoiceData = await getInvoiceData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default EcommerceDashboard diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/manage-reviews/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/manage-reviews/page.tsx new file mode 100644 index 0000000..e4874fd --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/manage-reviews/page.tsx @@ -0,0 +1,49 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import TotalReviews from '@views/apps/ecommerce/manage-reviews/TotalReviews' +import ReviewsStatistics from '@views/apps/ecommerce/manage-reviews/ReviewsStatistics' +import ManageReviewsTable from '@views/apps/ecommerce/manage-reviews/ManageReviewsTable' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const eCommerceManageReviews = async () => { + // Vars + const data = await getEcommerceData() + + return ( + + + + + + + + + + + + ) +} + +export default eCommerceManageReviews diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/details/[id]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/details/[id]/page.tsx new file mode 100644 index 0000000..cc526cd --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/details/[id]/page.tsx @@ -0,0 +1,46 @@ +// Next Imports +import { redirect } from 'next/navigation' + +// Type Imports +import type { OrderType } from '@/types/apps/ecommerceTypes' + +// Component Imports +import OrderDetails from '@views/apps/ecommerce/orders/details' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const OrderDetailsPage = async (props: { params: Promise<{ id: string }> }) => { + const params = await props.params + + // Vars + const data = await getEcommerceData() + + const filteredData = data?.orderData.filter((item: OrderType) => item.order === params.id)[0] + + if (!filteredData) { + redirect('/not-found') + } + + return filteredData ? : null +} + +export default OrderDetailsPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/list/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/list/page.tsx new file mode 100644 index 0000000..0d4ec9c --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/orders/list/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import OrderList from '@views/apps/ecommerce/orders/list' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const OrdersListPage = async () => { + // Vars + const data = await getEcommerceData() + + return +} + +export default OrdersListPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/add/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/add/page.tsx new file mode 100644 index 0000000..2f43b9a --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/add/page.tsx @@ -0,0 +1,49 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import ProductAddHeader from '@views/apps/ecommerce/products/add/ProductAddHeader' +import ProductInformation from '@views/apps/ecommerce/products/add/ProductInformation' +import ProductImage from '@views/apps/ecommerce/products/add/ProductImage' +import ProductVariants from '@views/apps/ecommerce/products/add/ProductVariants' +import ProductInventory from '@views/apps/ecommerce/products/add/ProductInventory' +import ProductPricing from '@views/apps/ecommerce/products/add/ProductPricing' +import ProductOrganize from '@views/apps/ecommerce/products/add/ProductOrganize' + +const eCommerceProductsAdd = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default eCommerceProductsAdd diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/category/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/category/page.tsx new file mode 100644 index 0000000..1a29746 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/category/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import ProductCategoryTable from '@views/apps/ecommerce/products/category/ProductCategoryTable' + +const eCommerceProductsCategory = () => { + return +} + +export default eCommerceProductsCategory diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/list/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/list/page.tsx new file mode 100644 index 0000000..decf05d --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/products/list/page.tsx @@ -0,0 +1,45 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import ProductCard from '@views/apps/ecommerce/products/list/ProductCard' +import ProductListTable from '@views/apps/ecommerce/products/list/ProductListTable' + +// Data Imports +import { getEcommerceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const eCommerceProductsList = async () => { + // Vars + const data = await getEcommerceData() + + return ( + + + + + + + + + ) +} + +export default eCommerceProductsList diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/referrals/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/referrals/page.tsx new file mode 100644 index 0000000..10af955 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/referrals/page.tsx @@ -0,0 +1,72 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import HorizontalStatisticsCard from '@views/apps/ecommerce/referrals/HorizontalStatisticsCard' +import IconStepsCard from '@views/apps/ecommerce/referrals/IconStepsCard' +import InviteAndShare from '@views/apps/ecommerce/referrals/InviteAndShare' +import ReferredUsersTable from '@views/apps/ecommerce/referrals/ReferredUsersTable' + +// Data Imports +import { getEcommerceData, getStatisticsData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getStatisticsData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/widget-examples`) + + if (!res.ok) { + throw new Error('Failed to fetch statistics data') + } + + return res.json() +} */ + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/ecommerce` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getEcommerceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/ecommerce`) + + if (!res.ok) { + throw new Error('Failed to fetch ecommerce data') + } + + return res.json() +} */ + +const eCommerceReferrals = async () => { + // Vars + const statsData = await getStatisticsData() + const ecommerceData = await getEcommerceData() + + return ( + + + + + + + + + + + + + + + ) +} + +export default eCommerceReferrals diff --git a/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/settings/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/settings/page.tsx new file mode 100644 index 0000000..93a0429 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/ecommerce/settings/page.tsx @@ -0,0 +1,31 @@ +// React Imports +import type { ReactElement } from 'react' + +// Next Imports +import dynamic from 'next/dynamic' + +// Component Imports +import Settings from '@views/apps/ecommerce/settings' + +const StoreDetailsTab = dynamic(() => import('@views/apps/ecommerce/settings/store-details')) +const PaymentsTab = dynamic(() => import('@views/apps/ecommerce/settings/payments')) +const CheckoutTab = dynamic(() => import('@views/apps/ecommerce/settings/checkout')) +const ShippingDeliveryTab = dynamic(() => import('@views/apps/ecommerce/settings/ShippingDelivery')) +const LocationsTab = dynamic(() => import('@views/apps/ecommerce/settings/locations')) +const NotificationsTab = dynamic(() => import('@views/apps/ecommerce/settings/Notifications')) + +// Vars +const tabContentList = (): { [key: string]: ReactElement } => ({ + 'store-details': , + payments: , + checkout: , + 'shipping-delivery': , + locations: , + notifications: +}) + +const eCommerceSettings = () => { + return +} + +export default eCommerceSettings diff --git a/src/app/[lang]/(dashboard)/(private)/apps/email/[folder]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/email/[folder]/page.tsx new file mode 100644 index 0000000..8735c01 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/email/[folder]/page.tsx @@ -0,0 +1,10 @@ +// Component Imports +import EmailWrapper from '@views/apps/email' + +const EmailFolderPage = async (props: { params: Promise<{ folder: string }> }) => { + const params = await props.params + + return +} + +export default EmailFolderPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/email/label/[label]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/email/label/[label]/page.tsx new file mode 100644 index 0000000..ee7243c --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/email/label/[label]/page.tsx @@ -0,0 +1,10 @@ +// Component Imports +import EmailWrapper from '@views/apps/email' + +const EmailLabelPage = async (props: { params: Promise<{ label: string }> }) => { + const params = await props.params + + return +} + +export default EmailLabelPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/email/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/email/page.tsx new file mode 100644 index 0000000..2731b04 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/email/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import EmailWrapper from '@views/apps/email' + +const EmailPage = () => { + return +} + +export default EmailPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/invoice/add/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/invoice/add/page.tsx new file mode 100644 index 0000000..6ddcb74 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/invoice/add/page.tsx @@ -0,0 +1,45 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import AddCard from '@views/apps/invoice/add/AddCard' +import AddActions from '@views/apps/invoice/add/AddActions' + +// Data Imports +import { getInvoiceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getInvoiceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/invoice`) + + if (!res.ok) { + throw new Error('Failed to fetch invoice data') + } + + return res.json() +} + */ +const InvoiceAdd = async () => { + // Vars + const data = await getInvoiceData() + + return ( + + + + + + + + + ) +} + +export default InvoiceAdd diff --git a/src/app/[lang]/(dashboard)/(private)/apps/invoice/edit/[id]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/invoice/edit/[id]/page.tsx new file mode 100644 index 0000000..a07fb3a --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/invoice/edit/[id]/page.tsx @@ -0,0 +1,59 @@ +// Next Imports +import { redirect } from 'next/navigation' + +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Type Imports +import type { InvoiceType } from '@/types/apps/invoiceTypes' + +// Component Imports +import EditCard from '@views/apps/invoice/edit/EditCard' +import EditActions from '@views/apps/invoice/edit/EditActions' + +// Data Imports +import { getInvoiceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getInvoiceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/invoice`) + + if (!res.ok) { + throw new Error('Failed to fetch invoice data') + } + + return res.json() +} */ + +const EditPage = async (props: { params: Promise<{ id: string }> }) => { + const params = await props.params + + // Vars + const data = await getInvoiceData() + + const filteredData = data?.filter((invoice: InvoiceType) => invoice.id === params.id)[0] + + if (!filteredData) { + redirect('/not-found') + } + + return filteredData ? ( + + + + + + + + + ) : null +} + +export default EditPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/invoice/list/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/invoice/list/page.tsx new file mode 100644 index 0000000..b6b8a80 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/invoice/list/page.tsx @@ -0,0 +1,41 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import InvoiceList from '@views/apps/invoice/list' + +// Data Imports +import { getInvoiceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getInvoiceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/invoice`) + + if (!res.ok) { + throw new Error('Failed to fetch invoice data') + } + + return res.json() +} */ + +const InvoiceApp = async () => { + // Vars + const data = await getInvoiceData() + + return ( + + + + + + ) +} + +export default InvoiceApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/invoice/preview/[id]/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/invoice/preview/[id]/page.tsx new file mode 100644 index 0000000..43f0c68 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/invoice/preview/[id]/page.tsx @@ -0,0 +1,46 @@ +// Next Imports +import { redirect } from 'next/navigation' + +// Type Imports +import type { InvoiceType } from '@/types/apps/invoiceTypes' + +// Component Imports +import Preview from '@views/apps/invoice/preview' + +// Data Imports +import { getInvoiceData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/invoice` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getInvoiceData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/invoice`) + + if (!res.ok) { + throw new Error('Failed to fetch invoice data') + } + + return res.json() +} */ + +const PreviewPage = async (props: { params: Promise<{ id: string }> }) => { + const params = await props.params + + // Vars + const data = await getInvoiceData() + + const filteredData = data?.filter((invoice: InvoiceType) => invoice.id === params.id)[0] + + if (!filteredData) { + redirect('/not-found') + } + + return filteredData ? : null +} + +export default PreviewPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/kanban/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/kanban/page.tsx new file mode 100644 index 0000000..c92d83d --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/kanban/page.tsx @@ -0,0 +1,27 @@ +// Third-party Imports +import classnames from 'classnames' + +// Component Imports +import KanbanBoard from '@views/apps/kanban/KanbanBoard' + +// Util Imports +import { commonLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styles Imports +import styles from '@views/apps/kanban/styles.module.css' + +const KanbanPage = () => { + return ( +
+ +
+ ) +} + +export default KanbanPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/logistics/dashboard/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/logistics/dashboard/page.tsx new file mode 100644 index 0000000..5af1fb7 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/logistics/dashboard/page.tsx @@ -0,0 +1,84 @@ +//MUI Imports +import Grid from '@mui/material/Grid2' + +//Component Imports +import LogisticsStatisticsCard from '@views/apps/logistics/dashboard/LogisticsStatisticsCard' +import LogisticsVehicleOverview from '@views/apps/logistics/dashboard/LogisticsVehicleOverview' +import LogisticsShipmentStatistics from '@views/apps/logistics/dashboard/LogisticsShipmentStatistics' +import LogisticsDeliveryPerformance from '@views/apps/logistics/dashboard/LogisticsDeliveryPerformance' +import LogisticsDeliveryExceptions from '@views/apps/logistics/dashboard/LogisticsDeliveryExceptions' +import LogisticsOrdersByCountries from '@/views/apps/logistics/dashboard/LogisticsOrdersByCountries' +import LogisticsOverviewTable from '@views/apps/logistics/dashboard/LogisticsOverviewTable' + +//Data Imports +import { getLogisticsData, getStatisticsData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getStatisticsData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/widget-examples`) + + if (!res.ok) { + throw new Error('Failed to fetch statisticsData') + } + + return res.json() +} */ + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/logistics` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getLogisticsData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/logistics`) + + if (!res.ok) { + throw new Error('Failed to fetch logistics data') + } + + return res.json() +} */ + +const LogisticsDashboard = async () => { + // Vars + const data = await getStatisticsData() + const vehicleData = await getLogisticsData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default LogisticsDashboard diff --git a/src/app/[lang]/(dashboard)/(private)/apps/logistics/fleet/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/logistics/fleet/page.tsx new file mode 100644 index 0000000..48e9ca8 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/logistics/fleet/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import Fleet from '@views/apps/logistics/fleet' + +const FleetPage = () => { + return +} + +export default FleetPage diff --git a/src/app/[lang]/(dashboard)/(private)/apps/permissions/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/permissions/page.tsx new file mode 100644 index 0000000..e79a6d6 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/permissions/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import Permissions from '@views/apps/permissions' + +// Data Imports +import { getPermissionsData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/permissions` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getPermissionsData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/permissions`) + + if (!res.ok) { + throw new Error('Failed to fetch permissions data') + } + + return res.json() +} */ + +const PermissionsApp = async () => { + // Vars + const data = await getPermissionsData() + + return +} + +export default PermissionsApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/roles/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/roles/page.tsx new file mode 100644 index 0000000..fd4340d --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/roles/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import Roles from '@views/apps/roles' + +// Data Imports +import { getUserData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/user-list` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getUserData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/user-list`) + + if (!res.ok) { + throw new Error('Failed to fetch userData') + } + + return res.json() +} */ + +const RolesApp = async () => { + // Vars + const data = await getUserData() + + return +} + +export default RolesApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/user/list/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/user/list/page.tsx new file mode 100644 index 0000000..e3b4c92 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/user/list/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import UserList from '@views/apps/user/list' + +// Data Imports +import { getUserData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/apps/user-list` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getUserData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/apps/user-list`) + + if (!res.ok) { + throw new Error('Failed to fetch userData') + } + + return res.json() +} */ + +const UserListApp = async () => { + // Vars + const data = await getUserData() + + return +} + +export default UserListApp diff --git a/src/app/[lang]/(dashboard)/(private)/apps/user/view/page.tsx b/src/app/[lang]/(dashboard)/(private)/apps/user/view/page.tsx new file mode 100644 index 0000000..045918c --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/apps/user/view/page.tsx @@ -0,0 +1,69 @@ +// React Imports +import type { ReactElement } from 'react' + +// Next Imports +import dynamic from 'next/dynamic' + +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Type Imports +import type { PricingPlanType } from '@/types/pages/pricingTypes' + +// Component Imports +import UserLeftOverview from '@views/apps/user/view/user-left-overview' +import UserRight from '@views/apps/user/view/user-right' + +// Data Imports +import { getPricingData } from '@/app/server/actions' + +const OverViewTab = dynamic(() => import('@views/apps/user/view/user-right/overview')) +const SecurityTab = dynamic(() => import('@views/apps/user/view/user-right/security')) +const BillingPlans = dynamic(() => import('@views/apps/user/view/user-right/billing-plans')) +const NotificationsTab = dynamic(() => import('@views/apps/user/view/user-right/notifications')) +const ConnectionsTab = dynamic(() => import('@views/apps/user/view/user-right/connections')) + +// Vars +const tabContentList = (data?: PricingPlanType[]): { [key: string]: ReactElement } => ({ + overview: , + security: , + 'billing-plans': , + notifications: , + connections: +}) + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/pricing` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getPricingData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/pricing`) + + if (!res.ok) { + throw new Error('Failed to fetch data') + } + + return res.json() +} */ + +const UserViewTab = async () => { + // Vars + const data = await getPricingData() + + return ( + + + + + + + + + ) +} + +export default UserViewTab diff --git a/src/app/[lang]/(dashboard)/(private)/charts/apex-charts/page.tsx b/src/app/[lang]/(dashboard)/(private)/charts/apex-charts/page.tsx new file mode 100644 index 0000000..0f87e8d --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/charts/apex-charts/page.tsx @@ -0,0 +1,72 @@ +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component Imports +import ApexBarChart from '@views/charts/apex/ApexBarChart' +import ApexAreaChart from '@views/charts/apex/ApexAreaChart' +import ApexLineChart from '@views/charts/apex/ApexLineChart' +import ApexRadarChart from '@views/charts/apex/ApexRadarChart' +import ApexDonutChart from '@views/charts/apex/ApexDonutChart' +import ApexColumnChart from '@views/charts/apex/ApexColumnChart' +import ApexScatterChart from '@views/charts/apex/ApexScatterChart' +import ApexHeatmapChart from '@views/charts/apex/ApexHeatmapChart' +import ApexRadialBarChart from '@views/charts/apex/ApexRadialBarChart' +import ApexCandlestickChart from '@views/charts/apex/ApexCandlestickChart' + +const ApexCharts = () => { + return ( + + + ApexCharts + + react-apexcharts is a third-party library. Please refer to its{' '} + + official documentation + {' '} + for more details. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default ApexCharts diff --git a/src/app/[lang]/(dashboard)/(private)/charts/recharts/page.tsx b/src/app/[lang]/(dashboard)/(private)/charts/recharts/page.tsx new file mode 100644 index 0000000..fda0957 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/charts/recharts/page.tsx @@ -0,0 +1,56 @@ +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component Imports +import RechartsBarChart from '@views/charts/recharts/RechartsBarChart' +import RechartsPieChart from '@views/charts/recharts/RechartsPieChart' +import RechartsLineChart from '@views/charts/recharts/RechartsLineChart' +import RechartsAreaChart from '@views/charts/recharts/RechartsAreaChart' +import RechartsRadarChart from '@views/charts/recharts/RechartsRadarChart' +import RechartsScatterChart from '@views/charts/recharts/RechartsScatterChart' + +const Recharts = () => { + return ( + + + Recharts + + recharts is a third-party library. Please refer to its{' '} + + official documentation + {' '} + for more details. + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default Recharts diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/academy/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/academy/page.tsx new file mode 100644 index 0000000..37d1b96 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/academy/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import AcademyDashboard from '../../apps/academy/dashboard/page' + +const DashboardAcademy = async () => { + return +} + +export default DashboardAcademy diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/analytics/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/analytics/page.tsx new file mode 100644 index 0000000..3c72d12 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/analytics/page.tsx @@ -0,0 +1,77 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Components Imports +import WebsiteAnalyticsSlider from '@views/dashboards/analytics/WebsiteAnalyticsSlider' +import LineAreaDailySalesChart from '@views/dashboards/analytics/LineAreaDailySalesChart' +import SalesOverview from '@views/dashboards/analytics/SalesOverview' +import EarningReports from '@views/dashboards/analytics/EarningReports' +import SupportTracker from '@views/dashboards/analytics/SupportTracker' +import SalesByCountries from '@views/dashboards/analytics/SalesByCountries' +import TotalEarning from '@views/dashboards/analytics/TotalEarning' +import MonthlyCampaignState from '@views/dashboards/analytics/MonthlyCampaignState' +import SourceVisits from '@views/dashboards/analytics/SourceVisits' +import ProjectsTable from '@views/dashboards/analytics/ProjectsTable' + +// Data Imports +import { getProfileData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/profile` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getProfileData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/profile`) + + if (!res.ok) { + throw new Error('Failed to fetch profileData') + } + + return res.json() +} */ + +const DashboardAnalytics = async () => { + // Vars + const data = await getProfileData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default DashboardAnalytics diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/crm/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/crm/page.tsx new file mode 100644 index 0000000..4b7327e --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/crm/page.tsx @@ -0,0 +1,88 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import DistributedBarChartOrder from '@views/dashboards/crm/DistributedBarChartOrder' +import LineAreaYearlySalesChart from '@views/dashboards/crm/LineAreaYearlySalesChart' +import CardStatVertical from '@/components/card-statistics/Vertical' +import BarChartRevenueGrowth from '@views/dashboards/crm/BarChartRevenueGrowth' +import EarningReportsWithTabs from '@views/dashboards/crm/EarningReportsWithTabs' +import RadarSalesChart from '@views/dashboards/crm/RadarSalesChart' +import SalesByCountries from '@views/dashboards/crm/SalesByCountries' +import ProjectStatus from '@views/dashboards/crm/ProjectStatus' +import ActiveProjects from '@views/dashboards/crm/ActiveProjects' +import LastTransaction from '@views/dashboards/crm/LastTransaction' +import ActivityTimeline from '@views/dashboards/crm/ActivityTimeline' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const DashboardCRM = async () => { + // Vars + const serverMode = await getServerMode() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default DashboardCRM diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/ecommerce/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/ecommerce/page.tsx new file mode 100644 index 0000000..acbe92f --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/ecommerce/page.tsx @@ -0,0 +1,7 @@ +import EcommerceDashboard from '../../apps/ecommerce/dashboard/page' + +const DashboardECommerce = () => { + return +} + +export default DashboardECommerce diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/logistics/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/logistics/page.tsx new file mode 100644 index 0000000..7df5210 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/logistics/page.tsx @@ -0,0 +1,7 @@ +import LogisticsDashboard from '../../apps/logistics/dashboard/page' + +const DashboardLogistics = () => { + return +} + +export default DashboardLogistics diff --git a/src/app/[lang]/(dashboard)/(private)/forms/form-layouts/page.tsx b/src/app/[lang]/(dashboard)/(private)/forms/form-layouts/page.tsx new file mode 100644 index 0000000..5f2f16f --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/forms/form-layouts/page.tsx @@ -0,0 +1,44 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component Imports +import FormLayoutsBasic from '@views/forms/form-layouts/FormLayoutsBasic' +import FormLayoutsIcon from '@views/forms/form-layouts/FormLayoutsIcons' +import FormLayoutsSeparator from '@views/forms/form-layouts/FormLayoutsSeparator' +import FormLayoutsTabs from '@views/forms/form-layouts/FormLayoutsTabs' +import FormLayoutsCollapsible from '@views/forms/form-layouts/FormLayoutsCollapsible' +import FormLayoutsAlignment from '@views/forms/form-layouts/FormLayoutsAlignment' + +const FormLayouts = () => { + return ( + + + + + + + + + + + + Form with Tabs + + + + + + Collapsible Sections + + + + + + + + + ) +} + +export default FormLayouts diff --git a/src/app/[lang]/(dashboard)/(private)/forms/form-validation/page.tsx b/src/app/[lang]/(dashboard)/(private)/forms/form-validation/page.tsx new file mode 100644 index 0000000..1e8ac64 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/forms/form-validation/page.tsx @@ -0,0 +1,44 @@ +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component Imports +import FormValidationBasic from '@views/forms/form-validation/FormValidationBasic' +import FormValidationOnSchema from '@views/forms/form-validation/FormValidationSchema' +import FormValidationAsyncSubmit from '@views/forms/form-validation/FormValidationAsyncSubmit' + +const FormValidation = () => { + return ( + + + React Hook Form + + react-hook-form is a third-party library. Please refer to its{' '} + + official documentation + {' '} + for more details. + + + + + + + + + + + + + ) +} + +export default FormValidation diff --git a/src/app/[lang]/(dashboard)/(private)/forms/form-wizard/page.tsx b/src/app/[lang]/(dashboard)/(private)/forms/form-wizard/page.tsx new file mode 100644 index 0000000..44f2374 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/forms/form-wizard/page.tsx @@ -0,0 +1,77 @@ +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component Imports +import StepperLinearWithValidation from '@views/forms/form-wizard/StepperLinearWithValidation' +import StepperAlternativeLabel from '@views/forms/form-wizard/StepperAlternativeLabel' +import StepperVerticalWithNumbers from '@views/forms/form-wizard/StepperVerticalWithNumbers' +import StepperVerticalWithoutNumbers from '@views/forms/form-wizard/StepperVerticalWithoutNumbers' +import StepperCustomHorizontal from '@views/forms/form-wizard/StepperCustomHorizontal' +import StepperCustomVertical from '@views/forms/form-wizard/StepperCustomVertical' + +const FormWizard = () => { + return ( + + + Stepper + + Please refer to MUI's official docs for more details on component's{' '} + + usage guide + {' '} + and{' '} + + API documentation + + . + + + + Linear Stepper with Validation + + + + + + Alternative Label + + + + + + + + + + + + Custom Horizontal Stepper + + + + + + Custom Vertical Stepper + + + + + + ) +} + +export default FormWizard diff --git a/src/app/[lang]/(dashboard)/(private)/layout.tsx b/src/app/[lang]/(dashboard)/(private)/layout.tsx new file mode 100644 index 0000000..6932bde --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/layout.tsx @@ -0,0 +1,76 @@ +// MUI Imports +import Button from '@mui/material/Button' + +// Type Imports +import type { ChildrenType } from '@core/types' +import type { Locale } from '@configs/i18n' + +// Layout Imports +import LayoutWrapper from '@layouts/LayoutWrapper' +import VerticalLayout from '@layouts/VerticalLayout' +import HorizontalLayout from '@layouts/HorizontalLayout' + +// Component Imports +import Providers from '@components/Providers' +import Navigation from '@components/layout/vertical/Navigation' +import Header from '@components/layout/horizontal/Header' +import Navbar from '@components/layout/vertical/Navbar' +import VerticalFooter from '@components/layout/vertical/Footer' +import HorizontalFooter from '@components/layout/horizontal/Footer' +import Customizer from '@core/components/customizer' +import ScrollToTop from '@core/components/scroll-to-top' +import AuthGuard from '@/hocs/AuthGuard' + +// Config Imports +import { i18n } from '@configs/i18n' + +// Util Imports +import { getDictionary } from '@/utils/getDictionary' +import { getMode, getSystemMode } from '@core/utils/serverHelpers' + +const Layout = async (props: ChildrenType & { params: Promise<{ lang: Locale }> }) => { + const params = await props.params + + const { children } = props + + // Vars + const direction = i18n.langDirection[params.lang] + const dictionary = await getDictionary(params.lang) + const mode = await getMode() + const systemMode = await getSystemMode() + + return ( + + + } + navbar={} + footer={} + > + {children} + + } + horizontalLayout={ + } footer={}> + {children} + + } + /> + + + + + + + ) +} + +export default Layout diff --git a/src/app/[lang]/(dashboard)/(private)/pages/account-settings/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/account-settings/page.tsx new file mode 100644 index 0000000..e308578 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/account-settings/page.tsx @@ -0,0 +1,29 @@ +// React Imports +import type { ReactElement } from 'react' + +// Next Imports +import dynamic from 'next/dynamic' + +// Component Imports +import AccountSettings from '@views/pages/account-settings' + +const AccountTab = dynamic(() => import('@views/pages/account-settings/account')) +const SecurityTab = dynamic(() => import('@views/pages/account-settings/security')) +const BillingPlansTab = dynamic(() => import('@views/pages/account-settings/billing-plans')) +const NotificationsTab = dynamic(() => import('@views/pages/account-settings/notifications')) +const ConnectionsTab = dynamic(() => import('@views/pages/account-settings/connections')) + +// Vars +const tabContentList = (): { [key: string]: ReactElement } => ({ + account: , + security: , + 'billing-plans': , + notifications: , + connections: +}) + +const AccountSettingsPage = () => { + return +} + +export default AccountSettingsPage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/dialog-examples/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/dialog-examples/page.tsx new file mode 100644 index 0000000..d451c8e --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/dialog-examples/page.tsx @@ -0,0 +1,77 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import DialogAddCard from '@views/pages/dialog-examples/DialogAddCard' +import DialogEditUserInfo from '@views/pages/dialog-examples/DialogEditUserInfo' +import DialogAuthentication from '@views/pages/dialog-examples/DialogAuthentication' +import DialogAddNewAddress from '@views/pages/dialog-examples/DialogAddNewAddress' +import DialogShareProject from '@views/pages/dialog-examples/DialogShareProject' +import DialogReferEarn from '@views/pages/dialog-examples/DialogReferEarn' +import DialogPaymentMethod from '@views/pages/dialog-examples/DialogPaymentMethod' +import DialogPaymentProviders from '@views/pages/dialog-examples/DialogPaymentProviders' +import DialogCreateApp from '@views/pages/dialog-examples/DialogCreateApp' +import DialogPricing from '@views/pages/dialog-examples/DialogPricing' + +// Data Imports +import { getPricingData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/pricing` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getPricingData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/pricing`) + + if (!res.ok) { + throw new Error('Failed to fetch data') + } + + return res.json() +} */ + +const DialogExamples = async () => { + // Vars + const data = await getPricingData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default DialogExamples diff --git a/src/app/[lang]/(dashboard)/(private)/pages/faq/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/faq/page.tsx new file mode 100644 index 0000000..a3995df --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/faq/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import FAQ from '@views/pages/faq' + +// Data Imports +import { getFaqData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/faq` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getFaqData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/faq`) + + if (!res.ok) { + throw new Error('Failed to fetch faqData') + } + + return res.json() +} */ + +const FAQPage = async () => { + // Vars + const data = await getFaqData() + + return +} + +export default FAQPage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/pricing/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/pricing/page.tsx new file mode 100644 index 0000000..c7b1bb6 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/pricing/page.tsx @@ -0,0 +1,32 @@ +// Component Imports +import Pricing from '@views/pages/pricing' + +// Data Imports +import { getPricingData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/pricing` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getPricingData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/pricing`) + + if (!res.ok) { + throw new Error('Failed to fetch data') + } + + return res.json() +} */ + +const PricePage = async () => { + // Vars + const data = await getPricingData() + + return +} + +export default PricePage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/user-profile/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/user-profile/page.tsx new file mode 100644 index 0000000..53435a8 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/user-profile/page.tsx @@ -0,0 +1,54 @@ +// React Imports +import type { ReactElement } from 'react' + +// Next Imports +import dynamic from 'next/dynamic' + +// Type Imports +import type { Data } from '@/types/pages/profileTypes' + +// Component Imports +import UserProfile from '@views/pages/user-profile' + +// Data Imports +import { getProfileData } from '@/app/server/actions' + +const ProfileTab = dynamic(() => import('@views/pages/user-profile/profile')) +const TeamsTab = dynamic(() => import('@views/pages/user-profile/teams')) +const ProjectsTab = dynamic(() => import('@views/pages/user-profile/projects')) +const ConnectionsTab = dynamic(() => import('@views/pages/user-profile/connections')) + +// Vars +const tabContentList = (data?: Data): { [key: string]: ReactElement } => ({ + profile: , + teams: , + projects: , + connections: +}) + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/profile` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getProfileData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/profile`) + + if (!res.ok) { + throw new Error('Failed to fetch profileData') + } + + return res.json() +} */ + +const ProfilePage = async () => { + // Vars + const data = await getProfileData() + + return +} + +export default ProfilePage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/actions/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/actions/page.tsx new file mode 100644 index 0000000..11787e8 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/actions/page.tsx @@ -0,0 +1,33 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Components Imports +import CardActionsTable from '@views/pages/widget-examples/actions/Table' +import CardActionCollapsible from '@views/pages/widget-examples/actions/Collapsible' +import CardActionRefreshContent from '@views/pages/widget-examples/actions/RefreshContent' +import CardActionRemoveCard from '@views/pages/widget-examples/actions/RemoveCard' +import CardActionAll from '@views/pages/widget-examples/actions/AllActions' + +const Actions = () => { + return ( + + + + + + + + + + + + + + + + + + ) +} + +export default Actions diff --git a/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/advanced/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/advanced/page.tsx new file mode 100644 index 0000000..3ca3436 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/advanced/page.tsx @@ -0,0 +1,95 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Components Imports +import MonthlyCampaignState from '@views/pages/widget-examples/advanced/MonthlyCampaignState' +import ActiveProjects from '@views/pages/widget-examples/advanced/ActiveProjects' +import SourceVisits from '@views/pages/widget-examples/advanced/SourceVisits' +import SalesByCountries from '@views/pages/widget-examples/advanced/SalesByCountries' +import EarningReports from '@views/pages/widget-examples/advanced/EarningReports' +import BrowserStates from '@views/pages/widget-examples/advanced/BrowserStates' +import Orders from '@views/pages/widget-examples/advanced/Orders' +import Transactions from '@views/pages/widget-examples/advanced/Transactions' +import PopularProducts from '@views/pages/widget-examples/advanced/PopularProducts' +import TopCourses from '@views/pages/widget-examples/advanced/TopCourses' +import UpcomingWebinar from '@views/pages/widget-examples/advanced/UpcomingWebinar' +import AssignmentProgress from '@views/pages/widget-examples/advanced/AssignmentProgress' +import DeliveryPerformance from '@views/pages/widget-examples/advanced/DeliveryPerformance' +import VehicleCondition from '@views/pages/widget-examples/advanced/VehicleCondition' +import PopularInstructors from '@views/pages/widget-examples/advanced/PopularInstructors' +import LastTransaction from '@views/pages/widget-examples/advanced/LastTransaction' +import ActivityTimeline from '@views/pages/widget-examples/advanced/ActivityTimeline' +import WebsiteAnalyticsSlider from '@views/pages/widget-examples/advanced/WebsiteAnalyticsSlider' +import Congratulations from '@/views/pages/widget-examples/advanced/Congratulations' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const Advanced = async () => { + // Vars + const serverMode = await getServerMode() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default Advanced diff --git a/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/basic/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/basic/page.tsx new file mode 100644 index 0000000..687ab55 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/basic/page.tsx @@ -0,0 +1,87 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' +import Divider from '@mui/material/Divider' + +// Components Imports +import CardInfluencingInfluencerWithImg from '@views/pages/widget-examples/basic/CardInfluencingInfluencerWithImg' +import CardUser from '@views/pages/widget-examples/basic/CardUser' +import CardWithCollapse from '@views/pages/widget-examples/basic/CardWithCollapse' +import CardMobile from '@views/pages/widget-examples/basic/CardMobile' +import CardHorizontalRatings from '@views/pages/widget-examples/basic/CardHorizontalRatings' +import CardWatch from '@views/pages/widget-examples/basic/CardWatch' +import CardLifetimeMembership from '@views/pages/widget-examples/basic/CardLifetimeMembership' +import CardInfluencingInfluencer from '@views/pages/widget-examples/basic/CardInfluencingInfluencer' +import CardVerticalRatings from '@views/pages/widget-examples/basic/CardVerticalRatings' +import CardSupport from '@views/pages/widget-examples/basic/CardSupport' +import CardWithTabs from '@views/pages/widget-examples/basic/CardWithTabs' +import CardWithTabsCenter from '@views/pages/widget-examples/basic/CardWithTabsCenter' +import CardTwitter from '@views/pages/widget-examples/basic/CardTwitter' +import CardFacebook from '@views/pages/widget-examples/basic/CardFacebook' +import CardLinkedIn from '@views/pages/widget-examples/basic/CardLinkedIn' + +const Basic = () => { + return ( + + + Basic Cards + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Navigation Cards + + + + + + + + + + Solid Cards + + + + + + + + + + + + + ) +} + +export default Basic diff --git a/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/charts/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/charts/page.tsx new file mode 100644 index 0000000..cfc9310 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/charts/page.tsx @@ -0,0 +1,57 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Components Imports +import EarningReports from '@views/pages/widget-examples/charts/EarningReports' +import SupportTracker from '@views/pages/widget-examples/charts/SupportTracker' +import Sales from '@views/pages/widget-examples/charts/Sales' +import RevenueReport from '@views/pages/widget-examples/charts/RevenueReport' +import ProjectStatus from '@views/pages/widget-examples/charts/ProjectStatus' +import EarningReportsWithTabs from '@views/pages/widget-examples/charts/EarningReportsWithTabs' +import TotalEarning from '@views/pages/widget-examples/charts/TotalEarning' +import CarrierPerformance from '@views/pages/widget-examples/charts/CarrierPerformance' +import DeliveryExceptions from '@views/pages/widget-examples/charts/DeliveryExceptions' +import VehicleOverview from '@views/pages/widget-examples/charts/VehicleOverview' +import InterestedTopics from '@views/pages/widget-examples/charts/InterestedTopics' + +const Charts = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default Charts diff --git a/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/statistics/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/statistics/page.tsx new file mode 100644 index 0000000..92dd3d9 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/widget-examples/statistics/page.tsx @@ -0,0 +1,121 @@ +// MUI Imports +import Grid from '@mui/material/Grid2' + +// Component Imports +import StatisticsCard from '@views/pages/widget-examples/statistics/StatisticsCard' +import Square from '@views/pages/widget-examples/statistics/Square' +import DistributedBarChartOrder from '@/views/pages/widget-examples/statistics/DistributedBarChartOrder' +import LineAreaYearlySalesChart from '@views/pages/widget-examples/statistics/LineAreaYearlySalesChart' +import LineChartProfit from '@views/pages/widget-examples/statistics/LineChartProfit' +import BarChartSessionsWithNegativeValues from '@views/pages/widget-examples/statistics/BarChartSessionsWithNegativeValues' +import RadialBarChart from '@views/pages/widget-examples/statistics/RadialBarChart' +import LineChartImpression from '@views/pages/widget-examples/statistics/LineChartImpression' +import Horizontal from '@views/pages/widget-examples/statistics/Horizontal' +import CardStatsLineAreaCharts from '@views/pages/widget-examples/statistics/CardStatsLineAreaCharts' +import LineAreaDailySalesChart from '@views/pages/widget-examples/statistics/LineAreaDailySalesChart' +import SalesOverview from '@views/pages/widget-examples/statistics/SalesOverview' +import BarChartDailyTraffic from '@views/pages/widget-examples/statistics/BarChartDailyTraffic' +import SubscribersOrders from '@views/pages/widget-examples/statistics/SubscribersOrders' +import Vertical from '@views/pages/widget-examples/statistics/Vertical' +import BarChartRevenueGrowth from '@views/pages/widget-examples/statistics/BarChartRevenueGrowth' +import DonutChartGeneratedLeads from '@views/pages/widget-examples/statistics/DonutChartGeneratedLeads' +import HorizontalStatisticsCard from '@views/pages/widget-examples/statistics/HorizontalStatisticsCard' +import CustomerStatisticsCard from '@views/pages/widget-examples/statistics/CustomerStatisticsCard' +import LogisticsStatisticsCard from '@views/apps/logistics/dashboard/LogisticsStatisticsCard' +import UserListCards from '@views/pages/widget-examples/statistics/UserListCards' + +// Data Imports +import { getStatisticsData } from '@/app/server/actions' + +/** + * ! If you need data using an API call, uncomment the below API code, update the `process.env.API_URL` variable in the + * ! `.env` file found at root of your project and also update the API endpoints like `/pages/widget-examples` in below example. + * ! Also, remove the above server action import and the action itself from the `src/app/server/actions.ts` file to clean up unused code + * ! because we've used the server action for getting our static data. + */ + +/* const getStatisticsData = async () => { + // Vars + const res = await fetch(`${process.env.API_URL}/pages/widget-examples`) + + if (!res.ok) { + throw new Error('Failed to fetch statistics data') + } + + return res.json() +} */ + +const Statistics = async () => { + // Vars + const statsData = await getStatisticsData() + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default Statistics diff --git a/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/checkout/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/checkout/page.tsx new file mode 100644 index 0000000..dee06a4 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/checkout/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import CheckoutWizard from '@views/pages/wizard-examples/checkout' + +const CheckoutPage = () => { + return +} + +export default CheckoutPage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/create-deal/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/create-deal/page.tsx new file mode 100644 index 0000000..59797c5 --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/create-deal/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import CreateDeal from '@views/pages/wizard-examples/create-deal' + +const CreateDealPage = () => { + return +} + +export default CreateDealPage diff --git a/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/property-listing/page.tsx b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/property-listing/page.tsx new file mode 100644 index 0000000..596663f --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/pages/wizard-examples/property-listing/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import PropertyListing from '@views/pages/wizard-examples/property-listing' + +const PropertyListingPage = () => { + return +} + +export default PropertyListingPage diff --git a/src/app/[lang]/(dashboard)/(private)/react-table/page.tsx b/src/app/[lang]/(dashboard)/(private)/react-table/page.tsx new file mode 100644 index 0000000..c7cc77c --- /dev/null +++ b/src/app/[lang]/(dashboard)/(private)/react-table/page.tsx @@ -0,0 +1,52 @@ +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' + +// Component imports +import BasicDataTables from '@views/react-table/BasicDataTables' +import EditableDataTables from '@views/react-table/EditableDataTables' +import ColumnVisibility from '@views/react-table/ColumnVisibility' +import RowSelection from '@views/react-table/RowSelection' +import KitchenSink from '@views/react-table/KitchenSink' + +const Tables = () => { + return ( + + + React Table + + @tanstack/react-table is a third-party library. Please refer to its{' '} + + official documentation + {' '} + for more details. + + + + + + + + + + + + + + + + + + + ) +} + +export default Tables diff --git a/src/app/[lang]/[...not-found]/page.tsx b/src/app/[lang]/[...not-found]/page.tsx new file mode 100644 index 0000000..0af6331 --- /dev/null +++ b/src/app/[lang]/[...not-found]/page.tsx @@ -0,0 +1,32 @@ +// Type Imports +import type { Locale } from '@configs/i18n' + +// Component Imports +import Providers from '@components/Providers' +import BlankLayout from '@layouts/BlankLayout' +import NotFound from '@views/NotFound' + +// Config Imports +import { i18n } from '@configs/i18n' + +// Util Imports +import { getServerMode, getSystemMode } from '@core/utils/serverHelpers' + +const NotFoundPage = async (props: { params: Promise<{ lang: Locale }> }) => { + const params = await props.params + + // Vars + const direction = i18n.langDirection[params.lang] + const mode = await getServerMode() + const systemMode = await getSystemMode() + + return ( + + + + + + ) +} + +export default NotFoundPage diff --git a/src/app/[lang]/layout.tsx b/src/app/[lang]/layout.tsx new file mode 100644 index 0000000..919865e --- /dev/null +++ b/src/app/[lang]/layout.tsx @@ -0,0 +1,60 @@ +// Next Imports +import { headers } from 'next/headers' + +// MUI Imports +import InitColorSchemeScript from '@mui/material/InitColorSchemeScript' + +// Third-party Imports +import 'react-perfect-scrollbar/dist/css/styles.css' + +// Type Imports +import type { ChildrenType } from '@core/types' +import type { Locale } from '@configs/i18n' + +// Component Imports + +// HOC Imports +import TranslationWrapper from '@/hocs/TranslationWrapper' + +// Config Imports +import { i18n } from '@configs/i18n' + +// Util Imports +import { getSystemMode } from '@core/utils/serverHelpers' + +// Style Imports +import '@/app/globals.css' + +// Generated Icon CSS Imports +import '@assets/iconify-icons/generated-icons.css' +import { ReactQueryProvider } from '../../providers/ReactQueryProvider' + +export const metadata = { + title: 'Vuexy - MUI Next.js Admin Dashboard Template', + description: + 'Vuexy - MUI Next.js Admin Dashboard Template - is the most developer friendly & highly customizable Admin Dashboard Template based on MUI v5.' +} + +const RootLayout = async (props: ChildrenType & { params: Promise<{ lang: Locale }> }) => { + const params = await props.params + + const { children } = props + + // Vars + const headersList = await headers() + const systemMode = await getSystemMode() + const direction = i18n.langDirection[params.lang] + + return ( + + + + + {children} + + + + ) +} + +export default RootLayout diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000..60a94e9 Binary files /dev/null and b/src/app/favicon.ico differ diff --git a/src/app/front-pages/checkout/page.tsx b/src/app/front-pages/checkout/page.tsx new file mode 100644 index 0000000..97a8286 --- /dev/null +++ b/src/app/front-pages/checkout/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import Checkout from '@views/front-pages/CheckoutPage' + +const CheckoutPage = () => { + return +} + +export default CheckoutPage diff --git a/src/app/front-pages/help-center/article/how-to-add-product-in-cart/page.tsx b/src/app/front-pages/help-center/article/how-to-add-product-in-cart/page.tsx new file mode 100644 index 0000000..2b75c58 --- /dev/null +++ b/src/app/front-pages/help-center/article/how-to-add-product-in-cart/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import Questions from '@views/front-pages/help-center/Questions' + +const Article = () => { + return +} + +export default Article diff --git a/src/app/front-pages/help-center/page.tsx b/src/app/front-pages/help-center/page.tsx new file mode 100644 index 0000000..ed54098 --- /dev/null +++ b/src/app/front-pages/help-center/page.tsx @@ -0,0 +1,8 @@ +// Component Imports +import HelpCenterWrapper from '@views/front-pages/help-center' + +function HelpCenterPage() { + return +} + +export default HelpCenterPage diff --git a/src/app/front-pages/landing-page/page.tsx b/src/app/front-pages/landing-page/page.tsx new file mode 100644 index 0000000..c641326 --- /dev/null +++ b/src/app/front-pages/landing-page/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import LandingPageWrapper from '@views/front-pages/landing-page' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +const LandingPage = async () => { + // Vars + const mode = await getServerMode() + + return +} + +export default LandingPage diff --git a/src/app/front-pages/layout.tsx b/src/app/front-pages/layout.tsx new file mode 100644 index 0000000..822513e --- /dev/null +++ b/src/app/front-pages/layout.tsx @@ -0,0 +1,65 @@ +// MUI Imports +import Button from '@mui/material/Button' +import InitColorSchemeScript from '@mui/material/InitColorSchemeScript' + +// Third-party Imports +import 'react-perfect-scrollbar/dist/css/styles.css' + +// Type Imports +import type { ChildrenType } from '@core/types' + +// Context Imports +import { IntersectionProvider } from '@/contexts/intersectionContext' + +// Component Imports +import Providers from '@components/Providers' +import BlankLayout from '@layouts/BlankLayout' +import FrontLayout from '@components/layout/front-pages' +import ScrollToTop from '@core/components/scroll-to-top' + +// Util Imports +import { getSystemMode } from '@core/utils/serverHelpers' + +// Style Imports +import '@/app/globals.css' + +// Generated Icon CSS Imports +import '@assets/iconify-icons/generated-icons.css' + +export const metadata = { + title: 'Vuexy - MUI Next.js Admin Dashboard Template', + description: + 'Vuexy - MUI Next.js Admin Dashboard Template - is the most developer friendly & highly customizable Admin Dashboard Template based on MUI v5.' +} + +const Layout = async ({ children }: ChildrenType) => { + // Vars + const systemMode = await getSystemMode() + + return ( + + + + + + + + {children} + + + + + + + + + + ) +} + +export default Layout diff --git a/src/app/front-pages/payment/page.tsx b/src/app/front-pages/payment/page.tsx new file mode 100644 index 0000000..356f346 --- /dev/null +++ b/src/app/front-pages/payment/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import Payment from '@views/front-pages/Payment' + +// Data Imports +import { getPricingData } from '@/app/server/actions' + +const PaymentPage = async () => { + // Vars + const data = await getPricingData() + + return +} + +export default PaymentPage diff --git a/src/app/front-pages/pricing/page.tsx b/src/app/front-pages/pricing/page.tsx new file mode 100644 index 0000000..e729de6 --- /dev/null +++ b/src/app/front-pages/pricing/page.tsx @@ -0,0 +1,14 @@ +// Component Imports +import PricingWrapper from '@/views/front-pages/pricing' + +// Data Imports +import { getPricingData } from '@/app/server/actions' + +const PricingPage = async () => { + // Vars + const data = await getPricingData() + + return +} + +export default PricingPage diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..110c590 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,133 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --border-radius: var(--mui-shape-borderRadius); + --border-color: var(--mui-palette-divider); + --primary-color: var(--mui-palette-primary-main); + --background-color: var(--mui-palette-background-default); + --background-color-rgb: var(--mui-palette-background-paperChannel); + --header-height: 54px; + --header-z-index: var(--mui-zIndex-appBar); + --footer-z-index: 10; + --customizer-z-index: var(--mui-zIndex-drawer); + --search-z-index: var(--mui-zIndex-tooltip); + --drawer-z-index: var(--mui-zIndex-drawer); + --backdrop-color: rgb(var(--mui-mainColorChannels-light) / 0.5); + --mui-mainColorChannels-shadow: var(--mui-mainColorChannels-lightShadow); +} + +[data-dark] { + --backdrop-color: rgb(23 25 37 / 0.6); + --mui-mainColorChannels-shadow: var(--mui-mainColorChannels-darkShadow); +} + +*, +::before, +::after { + box-sizing: border-box; + padding: 0; + margin: 0; + border-width: 0; + border-style: solid; + border-color: theme('borderColor.DEFAULT', currentColor); +} + +html { + display: flex; + inline-size: 100%; + min-block-size: 100%; +} + +a { + color: inherit; + text-decoration: none; +} + +ul:not([class]) { + margin-block: 1rem; + padding-inline-start: 40px; +} + +/*! Do not remove the following styles */ +/* + Fix the popout / submenu closing issue when using hover trigger to open the menu and using + perfectscrollbar where the bridge create with safe polygon by floating ui was not working +*/ +[data-floating-ui-safe-polygon] .scrollbar-container { + pointer-events: auto; +} +[data-floating-ui-safe-polygon] .scrollbar-container .ps__rail-y { + pointer-events: none; +} + +.ps__rail-y { + inset-inline-end: 0 !important; + inset-inline-start: auto !important; + & .ps__thumb-y { + inset-inline-end: 3px !important; + inset-inline-start: auto !important; + background-color: var(--mui-palette-divider); + inline-size: 6px; + &:hover, + &:focus, + &.ps--clicking { + background-color: var(--mui-palette-action-disabled) !important; + } + } + &:hover, + &:focus, + &.ps--clicking { + background-color: var(--mui-palette-action-hover) !important; + } + &:hover, + &:focus, + &.ps--clicking { + .ps__thumb-y { + background-color: var(--mui-palette-action-disabled) !important; + } + } +} + +.ts-vertical-nav-root { + .ps__thumb-y { + inline-size: 4px; + &:hover, + &:focus, + &.ps--clicking { + inline-size: 6px; + } + } + .ps__rail-y { + inline-size: 10px; + &:hover, + &:focus, + &.ps--clicking { + background-color: transparent !important; + .ps__thumb-y { + inline-size: 6px; + } + } + } +} + +:where([class^='tabler-']) { + font-size: 1.5rem; +} + +/* Fix width issue for the input-otp component */ +input[autocomplete='one-time-code'][data-input-otp='true'] { + inline-size: 100% !important; +} + +code { + font-family: inherit; + padding-block: 2px; + padding-inline: 4px; + border-radius: 4px; + font-size: 90%; + color: var(--mui-palette-info-main); + background-color: rgb(var(--mui-palette-info-mainChannel) / 0.08); + border: 0; +} diff --git a/src/app/server/actions.ts b/src/app/server/actions.ts new file mode 100644 index 0000000..a0bd8db --- /dev/null +++ b/src/app/server/actions.ts @@ -0,0 +1,58 @@ +/** + * ! The server actions below are used to fetch the static data from the fake-db. If you're using an ORM + * ! (Object-Relational Mapping) or a database, you can swap the code below with your own database queries. + */ + +'use server' + +// Data Imports +import { db as eCommerceData } from '@/fake-db/apps/ecommerce' +import { db as academyData } from '@/fake-db/apps/academy' +import { db as vehicleData } from '@/fake-db/apps/logistics' +import { db as invoiceData } from '@/fake-db/apps/invoice' +import { db as userData } from '@/fake-db/apps/userList' +import { db as permissionData } from '@/fake-db/apps/permissions' +import { db as profileData } from '@/fake-db/pages/userProfile' +import { db as faqData } from '@/fake-db/pages/faq' +import { db as pricingData } from '@/fake-db/pages/pricing' +import { db as statisticsData } from '@/fake-db/pages/widgetExamples' + +export const getEcommerceData = async () => { + return eCommerceData +} + +export const getAcademyData = async () => { + return academyData +} + +export const getLogisticsData = async () => { + return vehicleData +} + +export const getInvoiceData = async () => { + return invoiceData +} + +export const getUserData = async () => { + return userData +} + +export const getPermissionsData = async () => { + return permissionData +} + +export const getProfileData = async () => { + return profileData +} + +export const getFaqData = async () => { + return faqData +} + +export const getPricingData = async () => { + return pricingData +} + +export const getStatisticsData = async () => { + return statisticsData +} diff --git a/src/assets/iconify-icons/bundle-icons-css.ts b/src/assets/iconify-icons/bundle-icons-css.ts new file mode 100644 index 0000000..4dbce17 --- /dev/null +++ b/src/assets/iconify-icons/bundle-icons-css.ts @@ -0,0 +1,267 @@ +/** + * This is an advanced example for creating icon bundles for Iconify SVG Framework. + * + * It creates a bundle from: + * - All SVG files in a directory. + * - Custom JSON files. + * - Iconify icon sets. + * - SVG framework. + * + * This example uses Iconify Tools to import and clean up icons. + * For Iconify Tools documentation visit https://docs.iconify.design/tools/tools2/ + */ +import { promises as fs } from 'node:fs' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { createRequire } from 'node:module' + +// Installation: npm install --save-dev @iconify/tools @iconify/utils @iconify/json @iconify/iconify +import { cleanupSVG, importDirectory, isEmptyColor, parseColors, runSVGO } from '@iconify/tools' +import type { IconifyJSON } from '@iconify/types' +import { getIcons, getIconsCSS, stringToIcon } from '@iconify/utils' + +const require = createRequire(import.meta.url) + +async function generateIconsCSS() { + const __filename = fileURLToPath(import.meta.url) + const __dirname = dirname(__filename) + + /** + * Script configuration + */ + interface BundleScriptCustomSVGConfig { + // eslint-disable-next-line lines-around-comment + // Path to SVG files + dir: string + + // True if icons should be treated as monotone: colors replaced with currentColor + monotone: boolean + + // Icon set prefix + prefix: string + } + + interface BundleScriptCustomJSONConfig { + // eslint-disable-next-line lines-around-comment + // Path to JSON file + filename: string + + // List of icons to import. If missing, all icons will be imported + icons?: string[] + } + + interface BundleScriptConfig { + // eslint-disable-next-line lines-around-comment + // Custom SVG to import and bundle + svg?: BundleScriptCustomSVGConfig[] + + // Icons to bundled from @iconify/json packages + icons?: string[] + + // List of JSON files to bundled + // Entry can be a string, pointing to filename or a BundleScriptCustomJSONConfig object (see type above) + // If entry is a string or object without 'icons' property, an entire JSON file will be bundled + json?: (string | BundleScriptCustomJSONConfig)[] + } + + const sources: BundleScriptConfig = { + json: [ + // Iconify JSON file (@iconify/json is a package name, /json/ is directory where files are, then filename) + require.resolve('@iconify/json/json/tabler.json') + + // Custom file with only few icons + /* { + filename: require.resolve('@iconify/json/json/line-md.json'), + icons: ['home-twotone-alt', 'github', 'document-list', 'document-code', 'image-twotone'] + } */ + + // Custom JSON file + // 'json/gg.json' + ], + + icons: [ + 'bx-basket', + 'bi-airplane-engines', + 'ri-anchor-line', + 'uit-adobe-alt', + + // 'fa6-regular-comment', + 'twemoji-auto-rickshaw' + ], + + svg: [ + /* { + dir: 'src/assets/iconify-icons/svg', + monotone: false, + prefix: 'custom' + } */ + /* { + dir: 'src/assets/iconify-icons/emojis', + monotone: false, + prefix: 'emoji' + } */ + ] + } + + // File to save bundle to + const target = join(__dirname, 'generated-icons.css') + + /** + * Do stuff! + */ + + // Create directory for output if missing + const dir = dirname(target) + + try { + await fs.mkdir(dir, { + recursive: true + }) + } catch (err) { + // + } + + const allIcons: IconifyJSON[] = [] + + /** + * Convert sources.icons to sources.json + */ + if (sources.icons) { + const sourcesJSON = sources.json ? sources.json : (sources.json = []) + + // Sort icons by prefix + const organizedList = organizeIconsList(sources.icons) + + for (const prefix in organizedList) { + const filename = require.resolve(`@iconify/json/json/${prefix}.json`) + + sourcesJSON.push({ + filename, + icons: organizedList[prefix] + }) + } + } + + /** + * Bundle JSON files and collect icons + */ + if (sources.json) { + for (let i = 0; i < sources.json.length; i++) { + const item = sources.json[i] + + // Load icon set + const filename = typeof item === 'string' ? item : item.filename + const content = JSON.parse(await fs.readFile(filename, 'utf8')) as IconifyJSON + + // Filter icons + if (typeof item !== 'string' && item.icons?.length) { + const filteredContent = getIcons(content, item.icons) + + if (!filteredContent) throw new Error(`Cannot find required icons in ${filename}`) + + // Collect filtered icons + allIcons.push(filteredContent) + } else { + // Collect all icons from the JSON file + allIcons.push(content) + } + } + } + + /** + * Bundle custom SVG icons and collect icons + */ + if (sources.svg) { + for (let i = 0; i < sources.svg.length; i++) { + const source = sources.svg[i] + + // Import icons + const iconSet = await importDirectory(source.dir, { + prefix: source.prefix + }) + + // Validate, clean up, fix palette, etc. + await iconSet.forEach(async (name, type) => { + if (type !== 'icon') return + + // Get SVG instance for parsing + const svg = iconSet.toSVG(name) + + if (!svg) { + // Invalid icon + iconSet.remove(name) + + return + } + + // Clean up and optimise icons + try { + // Clean up icon code + await cleanupSVG(svg) + + if (source.monotone) { + // Replace color with currentColor, add if missing + // If icon is not monotone, remove this code + await parseColors(svg, { + defaultColor: 'currentColor', + callback: (attr, colorStr, color) => { + return !color || isEmptyColor(color) ? colorStr : 'currentColor' + } + }) + } + + // Optimise + await runSVGO(svg) + } catch (err) { + // Invalid icon + console.error(`Error parsing ${name} from ${source.dir}:`, err) + iconSet.remove(name) + + return + } + + // Update icon from SVG instance + iconSet.fromSVG(name, svg) + }) + + // Collect the SVG icon + allIcons.push(iconSet.export()) + } + } + + // Generate CSS from collected icons + const cssContent = allIcons + .map(iconSet => getIconsCSS(iconSet, Object.keys(iconSet.icons), { iconSelector: '.{prefix}-{name}' })) + .join('\n') + + // Save the CSS to a file + await fs.writeFile(target, cssContent, 'utf8') + + console.log(`Saved CSS to ${target}!`) +} + +generateIconsCSS().catch(err => { + console.error(err) +}) + +/** + * Sort icon names by prefix + */ +function organizeIconsList(icons: string[]): Record { + const sorted: Record = Object.create(null) + + icons.forEach(icon => { + const item = stringToIcon(icon) + + if (!item) return + + const prefix = item.prefix + const prefixList = sorted[prefix] ? sorted[prefix] : (sorted[prefix] = []) + + const name = item.name + + if (!prefixList.includes(name)) prefixList.push(name) + }) + + return sorted +} diff --git a/src/assets/svg/Keyboard.tsx b/src/assets/svg/Keyboard.tsx new file mode 100644 index 0000000..94a7657 --- /dev/null +++ b/src/assets/svg/Keyboard.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Keyboard = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Keyboard diff --git a/src/assets/svg/Paper.tsx b/src/assets/svg/Paper.tsx new file mode 100644 index 0000000..abf1a25 --- /dev/null +++ b/src/assets/svg/Paper.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Paper = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Paper diff --git a/src/assets/svg/Rocket.tsx b/src/assets/svg/Rocket.tsx new file mode 100644 index 0000000..3438600 --- /dev/null +++ b/src/assets/svg/Rocket.tsx @@ -0,0 +1,24 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Rocket = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Rocket diff --git a/src/assets/svg/front-pages/help-center/Bulb.tsx b/src/assets/svg/front-pages/help-center/Bulb.tsx new file mode 100644 index 0000000..3837d36 --- /dev/null +++ b/src/assets/svg/front-pages/help-center/Bulb.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Bulb = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Bulb diff --git a/src/assets/svg/front-pages/help-center/Discord.tsx b/src/assets/svg/front-pages/help-center/Discord.tsx new file mode 100644 index 0000000..7387130 --- /dev/null +++ b/src/assets/svg/front-pages/help-center/Discord.tsx @@ -0,0 +1,30 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Discord = (props: SVGAttributes) => { + return ( + + + + + + ) +} + +export default Discord diff --git a/src/assets/svg/front-pages/help-center/File.tsx b/src/assets/svg/front-pages/help-center/File.tsx new file mode 100644 index 0000000..40437bf --- /dev/null +++ b/src/assets/svg/front-pages/help-center/File.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const File = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default File diff --git a/src/assets/svg/front-pages/help-center/Gift.tsx b/src/assets/svg/front-pages/help-center/Gift.tsx new file mode 100644 index 0000000..9eb0c9a --- /dev/null +++ b/src/assets/svg/front-pages/help-center/Gift.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Gift = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Gift diff --git a/src/assets/svg/front-pages/help-center/Laptop.tsx b/src/assets/svg/front-pages/help-center/Laptop.tsx new file mode 100644 index 0000000..2b9787c --- /dev/null +++ b/src/assets/svg/front-pages/help-center/Laptop.tsx @@ -0,0 +1,24 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Laptop = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Laptop diff --git a/src/assets/svg/front-pages/help-center/Rocket.tsx b/src/assets/svg/front-pages/help-center/Rocket.tsx new file mode 100644 index 0000000..24241f8 --- /dev/null +++ b/src/assets/svg/front-pages/help-center/Rocket.tsx @@ -0,0 +1,24 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Rocket = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Rocket diff --git a/src/assets/svg/front-pages/landing-page/Airbnb.tsx b/src/assets/svg/front-pages/landing-page/Airbnb.tsx new file mode 100644 index 0000000..3c795ff --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Airbnb.tsx @@ -0,0 +1,16 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Airbnb = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default Airbnb diff --git a/src/assets/svg/front-pages/landing-page/Check.tsx b/src/assets/svg/front-pages/landing-page/Check.tsx new file mode 100644 index 0000000..345daf2 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Check.tsx @@ -0,0 +1,23 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Check = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Check diff --git a/src/assets/svg/front-pages/landing-page/Coinbase.tsx b/src/assets/svg/front-pages/landing-page/Coinbase.tsx new file mode 100644 index 0000000..4726a1b --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Coinbase.tsx @@ -0,0 +1,18 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Coinbase = (props: SVGAttributes) => { + return ( + + + + + + ) +} + +export default Coinbase diff --git a/src/assets/svg/front-pages/landing-page/Diamond.tsx b/src/assets/svg/front-pages/landing-page/Diamond.tsx new file mode 100644 index 0000000..5a5b145 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Diamond.tsx @@ -0,0 +1,29 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Diamond = (props: SVGAttributes) => { + return ( + + + + + + ) +} + +export default Diamond diff --git a/src/assets/svg/front-pages/landing-page/Document.tsx b/src/assets/svg/front-pages/landing-page/Document.tsx new file mode 100644 index 0000000..0b78415 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Document.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Document = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Document diff --git a/src/assets/svg/front-pages/landing-page/Dribbble.tsx b/src/assets/svg/front-pages/landing-page/Dribbble.tsx new file mode 100644 index 0000000..2745ce4 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Dribbble.tsx @@ -0,0 +1,15 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Dribbble = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default Dribbble diff --git a/src/assets/svg/front-pages/landing-page/HubSpot.tsx b/src/assets/svg/front-pages/landing-page/HubSpot.tsx new file mode 100644 index 0000000..54a5b4f --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/HubSpot.tsx @@ -0,0 +1,15 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const HubSpot = (props: SVGAttributes) => { + return ( + + + + ) +} + +export default HubSpot diff --git a/src/assets/svg/front-pages/landing-page/LaptopCharging.tsx b/src/assets/svg/front-pages/landing-page/LaptopCharging.tsx new file mode 100644 index 0000000..24b0e15 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/LaptopCharging.tsx @@ -0,0 +1,23 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const LaptopCharging = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default LaptopCharging diff --git a/src/assets/svg/front-pages/landing-page/Netflix.tsx b/src/assets/svg/front-pages/landing-page/Netflix.tsx new file mode 100644 index 0000000..9c23106 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Netflix.tsx @@ -0,0 +1,15 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Netflix = (props: SVGAttributes) => { + return ( + + ) +} + +export default Netflix diff --git a/src/assets/svg/front-pages/landing-page/Paper.tsx b/src/assets/svg/front-pages/landing-page/Paper.tsx new file mode 100644 index 0000000..95ef99f --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Paper.tsx @@ -0,0 +1,22 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Paper = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Paper diff --git a/src/assets/svg/front-pages/landing-page/Pinterest.tsx b/src/assets/svg/front-pages/landing-page/Pinterest.tsx new file mode 100644 index 0000000..420c5b7 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Pinterest.tsx @@ -0,0 +1,18 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Pinterest = (props: SVGAttributes) => { + return ( + + + + + + ) +} + +export default Pinterest diff --git a/src/assets/svg/front-pages/landing-page/Rocket.tsx b/src/assets/svg/front-pages/landing-page/Rocket.tsx new file mode 100644 index 0000000..50a52d3 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/Rocket.tsx @@ -0,0 +1,24 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const Rocket = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default Rocket diff --git a/src/assets/svg/front-pages/landing-page/User.tsx b/src/assets/svg/front-pages/landing-page/User.tsx new file mode 100644 index 0000000..247f483 --- /dev/null +++ b/src/assets/svg/front-pages/landing-page/User.tsx @@ -0,0 +1,23 @@ +// React Imports +import type { SVGAttributes } from 'react' + +const User = (props: SVGAttributes) => { + return ( + + + + + ) +} + +export default User diff --git a/src/components/AuthRedirect.tsx b/src/components/AuthRedirect.tsx new file mode 100644 index 0000000..3bedf0e --- /dev/null +++ b/src/components/AuthRedirect.tsx @@ -0,0 +1,26 @@ +'use client' + +// Next Imports +import { redirect, usePathname } from 'next/navigation' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +const AuthRedirect = ({ lang }: { lang: Locale }) => { + const pathname = usePathname() + + // ℹ️ Bring me `lang` + const redirectUrl = `/${lang}/login?redirectTo=${pathname}` + const login = `/${lang}/login` + const homePage = getLocalizedUrl(themeConfig.homePageUrl, lang) + + return redirect(pathname === login ? login : pathname === homePage ? login : redirectUrl) +} + +export default AuthRedirect diff --git a/src/components/DirectionalIcon.tsx b/src/components/DirectionalIcon.tsx new file mode 100644 index 0000000..2da845f --- /dev/null +++ b/src/components/DirectionalIcon.tsx @@ -0,0 +1,35 @@ +'use client' + +// MUI Imports +import { useTheme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +type Props = { + ltrIconClass: string + rtlIconClass: string + className?: string +} + +const DirectionalIcon = (props: Props) => { + // Props + const { ltrIconClass, rtlIconClass, className } = props + + // Hooks + const theme = useTheme() + + return ( + + ) +} + +export default DirectionalIcon diff --git a/src/components/Form.tsx b/src/components/Form.tsx new file mode 100644 index 0000000..19c4823 --- /dev/null +++ b/src/components/Form.tsx @@ -0,0 +1,15 @@ +'use client' + +// React Imports +import type { DetailedHTMLProps, FormHTMLAttributes } from 'react' + +type Props = DetailedHTMLProps, HTMLFormElement> + +const FormComponent = (props: Props) => { + // Props + const { onSubmit, ...rest } = props + + return
onSubmit(e) : e => e.preventDefault()} /> +} + +export default FormComponent diff --git a/src/components/GenerateMenu.tsx b/src/components/GenerateMenu.tsx new file mode 100644 index 0000000..6aed403 --- /dev/null +++ b/src/components/GenerateMenu.tsx @@ -0,0 +1,216 @@ +// React Imports +import type { ReactNode } from 'react' + +// Next Imports +import { useParams } from 'next/navigation' + +// MUI Imports +import type { ChipProps } from '@mui/material/Chip' + +// Type Imports +import type { Locale } from '@configs/i18n' +import type { + VerticalMenuDataType, + VerticalSectionDataType, + VerticalSubMenuDataType, + VerticalMenuItemDataType, + HorizontalMenuDataType, + HorizontalSubMenuDataType, + HorizontalMenuItemDataType +} from '@/types/menuTypes' + +// Component Imports +import { SubMenu as HorizontalSubMenu, MenuItem as HorizontalMenuItem } from '@menu/horizontal-menu' +import { SubMenu as VerticalSubMenu, MenuItem as VerticalMenuItem, MenuSection } from '@menu/vertical-menu' +import CustomChip from '@core/components/mui/Chip' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +// Generate a menu from the menu data array +export const GenerateVerticalMenu = ({ menuData }: { menuData: VerticalMenuDataType[] }) => { + // Hooks + const { lang: locale } = useParams() + + const renderMenuItems = (data: VerticalMenuDataType[]) => { + // Use the map method to iterate through the array of menu data + return data.map((item: VerticalMenuDataType, index) => { + const menuSectionItem = item as VerticalSectionDataType + const subMenuItem = item as VerticalSubMenuDataType + const menuItem = item as VerticalMenuItemDataType + + // Check if the current item is a section + if (menuSectionItem.isSection) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { children, isSection, ...rest } = menuSectionItem + + // If it is, return a MenuSection component and call generateMenu with the current menuSectionItem's children + return ( + + {children && renderMenuItems(children)} + + ) + } + + // Check if the current item is a sub menu + if (subMenuItem.children) { + const { children, icon, prefix, suffix, ...rest } = subMenuItem + + const Icon = icon ? : null + + const subMenuPrefix: ReactNode = + prefix && (prefix as ChipProps).label ? ( + + ) : ( + (prefix as ReactNode) + ) + + const subMenuSuffix: ReactNode = + suffix && (suffix as ChipProps).label ? ( + + ) : ( + (suffix as ReactNode) + ) + + // If it is, return a SubMenu component and call generateMenu with the current subMenuItem's children + return ( + + {children && renderMenuItems(children)} + + ) + } + + // If the current item is neither a section nor a sub menu, return a MenuItem component + const { label, excludeLang, icon, prefix, suffix, ...rest } = menuItem + + // Localize the href + const href = rest.href?.startsWith('http') + ? rest.href + : rest.href && (excludeLang ? rest.href : getLocalizedUrl(rest.href, locale as Locale)) + + const Icon = icon ? : null + + const menuItemPrefix: ReactNode = + prefix && (prefix as ChipProps).label ? ( + + ) : ( + (prefix as ReactNode) + ) + + const menuItemSuffix: ReactNode = + suffix && (suffix as ChipProps).label ? ( + + ) : ( + (suffix as ReactNode) + ) + + return ( + + {label} + + ) + }) + } + + return <>{renderMenuItems(menuData)} +} + +// Generate a menu from the menu data array +export const GenerateHorizontalMenu = ({ menuData }: { menuData: HorizontalMenuDataType[] }) => { + // Hooks + const { lang: locale } = useParams() + + const renderMenuItems = (data: HorizontalMenuDataType[]) => { + // Use the map method to iterate through the array of menu data + return data.map((item: HorizontalMenuDataType, index) => { + const subMenuItem = item as HorizontalSubMenuDataType + const menuItem = item as HorizontalMenuItemDataType + + // Check if the current item is a sub menu + if (subMenuItem.children) { + const { children, icon, prefix, suffix, ...rest } = subMenuItem + + const Icon = icon ? : null + + const subMenuPrefix: ReactNode = + prefix && (prefix as ChipProps).label ? ( + + ) : ( + (prefix as ReactNode) + ) + + const subMenuSuffix: ReactNode = + suffix && (suffix as ChipProps).label ? ( + + ) : ( + (suffix as ReactNode) + ) + + // If it is, return a SubMenu component and call generateMenu with the current subMenuItem's children + return ( + + {children && renderMenuItems(children)} + + ) + } + + // If the current item is not a sub menu, return a MenuItem component + const { label, excludeLang, icon, prefix, suffix, ...rest } = menuItem + + // Localize the href + const href = rest.href?.startsWith('http') + ? rest.href + : rest.href && (excludeLang ? rest.href : getLocalizedUrl(rest.href, locale as Locale)) + + const Icon = icon ? : null + + const menuItemPrefix: ReactNode = + prefix && (prefix as ChipProps).label ? ( + + ) : ( + (prefix as ReactNode) + ) + + const menuItemSuffix: ReactNode = + suffix && (suffix as ChipProps).label ? ( + + ) : ( + (suffix as ReactNode) + ) + + return ( + + {label} + + ) + }) + } + + return <>{renderMenuItems(menuData)} +} diff --git a/src/components/LangRedirect.tsx b/src/components/LangRedirect.tsx new file mode 100644 index 0000000..7fda85e --- /dev/null +++ b/src/components/LangRedirect.tsx @@ -0,0 +1,17 @@ +'use client' + +// Next Imports +import { redirect, usePathname } from 'next/navigation' + +// Config Imports +import { i18n } from '@configs/i18n' + +const LangRedirect = () => { + const pathname = usePathname() + + const redirectUrl = `/${i18n.defaultLocale}${pathname}` + + redirect(redirectUrl) +} + +export default LangRedirect diff --git a/src/components/Link.tsx b/src/components/Link.tsx new file mode 100644 index 0000000..dcfcafe --- /dev/null +++ b/src/components/Link.tsx @@ -0,0 +1,29 @@ +'use client' + +// React Imports +import { forwardRef } from 'react' +import type { ComponentProps, ForwardedRef, MouseEvent } from 'react' + +// Next Imports +import NextLink from 'next/link' + +type Props = Omit, 'href' | 'onClick'> & { + href?: string + onClick?: (event: MouseEvent) => void +} + +const Link = (props: Props, ref: ForwardedRef) => { + // Props + const { href, onClick, ...rest } = props + + return ( + onClick(e) : !href ? e => e.preventDefault() : undefined} + /> + ) +} + +export default forwardRef(Link) diff --git a/src/components/Providers.tsx b/src/components/Providers.tsx new file mode 100644 index 0000000..45217fe --- /dev/null +++ b/src/components/Providers.tsx @@ -0,0 +1,44 @@ +// Type Imports +import type { ChildrenType, Direction } from '@core/types' + +// Context Imports +import { VerticalNavProvider } from '@menu/contexts/verticalNavContext' +import { SettingsProvider } from '@core/contexts/settingsContext' +import ThemeProvider from '@components/theme' +import ReduxProvider from '@/redux-store/ReduxProvider' + +// Styled Component Imports +import AppReactToastify from '@/libs/styles/AppReactToastify' + +// Util Imports +import { getMode, getSettingsFromCookie, getSystemMode } from '@core/utils/serverHelpers' +import { AuthProvider } from '../contexts/authContext' + +type Props = ChildrenType & { + direction: Direction +} + +const Providers = async (props: Props) => { + // Props + const { children, direction } = props + + // Vars + const mode = await getMode() + const settingsCookie = await getSettingsFromCookie() + const systemMode = await getSystemMode() + + return ( + + + + + {children} + + + + + + ) +} + +export default Providers diff --git a/src/components/TablePaginationComponent.tsx b/src/components/TablePaginationComponent.tsx new file mode 100644 index 0000000..33fe4e8 --- /dev/null +++ b/src/components/TablePaginationComponent.tsx @@ -0,0 +1,38 @@ +// MUI Imports +import Pagination from '@mui/material/Pagination' +import Typography from '@mui/material/Typography' + +// Third Party Imports +import type { useReactTable } from '@tanstack/react-table' + +const TablePaginationComponent = ({ table }: { table: ReturnType }) => { + return ( +
+ + {`Showing ${ + table.getFilteredRowModel().rows.length === 0 + ? 0 + : table.getState().pagination.pageIndex * table.getState().pagination.pageSize + 1 + } + to ${Math.min( + (table.getState().pagination.pageIndex + 1) * table.getState().pagination.pageSize, + table.getFilteredRowModel().rows.length + )} of ${table.getFilteredRowModel().rows.length} entries`} + + { + table.setPageIndex(page - 1) + }} + showFirstButton + showLastButton + /> +
+ ) +} + +export default TablePaginationComponent diff --git a/src/components/card-statistics/CardStatsSquare.tsx b/src/components/card-statistics/CardStatsSquare.tsx new file mode 100644 index 0000000..0cecc0a --- /dev/null +++ b/src/components/card-statistics/CardStatsSquare.tsx @@ -0,0 +1,31 @@ +// MUI imports +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Typography from '@mui/material/Typography' + +// Types Imports +import type { CardStatsSquareProps } from '@/types/pages/widgetTypes' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +const CardStatsSquare = (props: CardStatsSquareProps) => { + // Props + const { avatarColor, avatarIcon, stats, statsTitle, avatarVariant, avatarSize, avatarSkin } = props + + return ( + + + + + +
+ {stats} + {statsTitle} +
+
+
+ ) +} + +export default CardStatsSquare diff --git a/src/components/card-statistics/CustomerStats.tsx b/src/components/card-statistics/CustomerStats.tsx new file mode 100644 index 0000000..417c1d1 --- /dev/null +++ b/src/components/card-statistics/CustomerStats.tsx @@ -0,0 +1,45 @@ +// MUI Imports +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Chip from '@mui/material/Chip' +import Typography from '@mui/material/Typography' + +// Type Imports +import type { CardStatsCustomerStatsProps } from '@/types/pages/widgetTypes' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +const CustomerStats = (props: CardStatsCustomerStatsProps) => { + // Props + const { title, avatarIcon, color, description, stats, content, chipLabel } = props + + return ( + + + + + + + {title} + + +
+ {stats ? ( +
+ + {stats} + + {content} +
+ ) : ( + + )} + {description} +
+
+
+ ) +} + +export default CustomerStats diff --git a/src/components/card-statistics/Horizontal.tsx b/src/components/card-statistics/Horizontal.tsx new file mode 100644 index 0000000..8d60cbf --- /dev/null +++ b/src/components/card-statistics/Horizontal.tsx @@ -0,0 +1,38 @@ +// MUI Imports +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Typography from '@mui/material/Typography' + +// Third-party Imports +import classnames from 'classnames' + +// Types Imports +import type { CardStatsHorizontalProps } from '@/types/pages/widgetTypes' + +// Components Imports +import CustomAvatar from '@core/components/mui/Avatar' + +const CardStatHorizontal = (props: CardStatsHorizontalProps) => { + // Props + const { stats, avatarIcon, avatarColor, title, avatarSkin, avatarSize } = props + + return ( + + +
+
+ {stats} + + {title} + +
+ + + +
+
+
+ ) +} + +export default CardStatHorizontal diff --git a/src/components/card-statistics/HorizontalWithAvatar.tsx b/src/components/card-statistics/HorizontalWithAvatar.tsx new file mode 100644 index 0000000..fb57b22 --- /dev/null +++ b/src/components/card-statistics/HorizontalWithAvatar.tsx @@ -0,0 +1,31 @@ +// MUI Imports +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Typography from '@mui/material/Typography' + +// Type Imports +import type { CardStatsHorizontalWithAvatarProps } from '@/types/pages/widgetTypes' + +// Components Imports +import CustomAvatar from '@core/components/mui/Avatar' + +const HorizontalWithAvatar = (props: CardStatsHorizontalWithAvatarProps) => { + // Props + const { stats, title, avatarIcon, avatarColor, avatarVariant, avatarSkin, avatarSize } = props + + return ( + + +
+ {stats} + {title} +
+ + + +
+
+ ) +} + +export default HorizontalWithAvatar diff --git a/src/components/card-statistics/HorizontalWithBorder.tsx b/src/components/card-statistics/HorizontalWithBorder.tsx new file mode 100644 index 0000000..fe36868 --- /dev/null +++ b/src/components/card-statistics/HorizontalWithBorder.tsx @@ -0,0 +1,69 @@ +'use client' + +// MUI Imports +import MuiCard from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Typography from '@mui/material/Typography' +import { styled } from '@mui/material/styles' +import type { CardProps } from '@mui/material/Card' + +// Third-party Imports +import classnames from 'classnames' + +// Types Imports +import type { ThemeColor } from '@core/types' +import type { CardStatsHorizontalWithBorderProps } from '@/types/pages/widgetTypes' + +//Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +type Props = CardProps & { + color: ThemeColor +} + +const Card = styled(MuiCard)(({ color }) => ({ + transition: 'border 0.3s ease-in-out, box-shadow 0.3s ease-in-out, margin 0.3s ease-in-out', + borderBottomWidth: '2px', + borderBottomColor: `var(--mui-palette-${color}-darkerOpacity)`, + '[data-skin="bordered"] &:hover': { + boxShadow: 'none' + }, + '&:hover': { + borderBottomWidth: '3px', + borderBottomColor: `var(--mui-palette-${color}-main) !important`, + boxShadow: 'var(--mui-customShadows-lg)', + marginBlockEnd: '-1px' + } +})) + +const HorizontalWithBorder = (props: CardStatsHorizontalWithBorderProps) => { + // Props + const { title, stats, trendNumber, avatarIcon, color } = props + + return ( + + +
+ + + + {stats} +
+
+ {title} +
+ {`${trendNumber > 0 ? '+' : ''}${trendNumber}%`} + + than last week + +
+
+
+
+ ) +} + +export default HorizontalWithBorder diff --git a/src/components/card-statistics/HorizontalWithSubtitle.tsx b/src/components/card-statistics/HorizontalWithSubtitle.tsx new file mode 100644 index 0000000..af663b5 --- /dev/null +++ b/src/components/card-statistics/HorizontalWithSubtitle.tsx @@ -0,0 +1,50 @@ +// MUI Imports +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import Typography from '@mui/material/Typography' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { ThemeColor } from '@core/types' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +export type UserDataType = { + title: string + stats: string + avatarIcon: string + avatarColor?: ThemeColor + trend: string + trendNumber: string + subtitle: string +} + +const HorizontalWithSubtitle = (props: UserDataType) => { + // Props + const { title, stats, avatarIcon, avatarColor, trend: trend, trendNumber: trendNumber, subtitle: subtitle } = props + + return ( + + +
+ {title} +
+ {stats} + + {`(${trend === 'negative' ? '-' : '+'}${trendNumber})`} + +
+ {subtitle} +
+ + + +
+
+ ) +} + +export default HorizontalWithSubtitle diff --git a/src/components/card-statistics/StatsWithAreaChart.tsx b/src/components/card-statistics/StatsWithAreaChart.tsx new file mode 100644 index 0000000..eae0de9 --- /dev/null +++ b/src/components/card-statistics/StatsWithAreaChart.tsx @@ -0,0 +1,105 @@ +'use client' + +// Next Imports +import dynamic from 'next/dynamic' + +// MUI Imports +import Card from '@mui/material/Card' +import Typography from '@mui/material/Typography' +import CardContent from '@mui/material/CardContent' +import { useTheme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' +import type { ApexOptions } from 'apexcharts' + +// Type Imports +import type { CardStatsWithAreaChartProps } from '@/types/pages/widgetTypes' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +// Styled Component Imports +const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts')) + +const CardStatsWithAreaChart = (props: CardStatsWithAreaChartProps) => { + // Props + const { stats, title, avatarIcon, chartSeries, avatarSize, chartColor = 'primary', avatarColor, avatarSkin } = 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: { + 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: 'var(--mui-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/components/card-statistics/Vertical.tsx b/src/components/card-statistics/Vertical.tsx new file mode 100644 index 0000000..4daa13c --- /dev/null +++ b/src/components/card-statistics/Vertical.tsx @@ -0,0 +1,38 @@ +// 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' + +// Third-party Imports +import classnames from 'classnames' + +// Type Import +import type { CardStatsVerticalProps } from '@/types/pages/widgetTypes' + +// Component Import +import CustomAvatar from '@core/components/mui/Avatar' + +const CardStatsVertical = (props: CardStatsVerticalProps) => { + // Props + const { stats, title, subtitle, avatarIcon, avatarColor, avatarSize, avatarSkin, chipText, chipColor, chipVariant } = + props + + return ( + + + + + +
+ {title} + {subtitle} + {stats} +
+ +
+
+ ) +} + +export default CardStatsVertical diff --git a/src/components/dialogs/DialogCloseButton.tsx b/src/components/dialogs/DialogCloseButton.tsx new file mode 100644 index 0000000..c230684 --- /dev/null +++ b/src/components/dialogs/DialogCloseButton.tsx @@ -0,0 +1,30 @@ +'use client' + +//Mui Imports +import { styled } from '@mui/material' +import Button from '@mui/material/Button' +import type { ButtonProps } from '@mui/material/Button' + +const DialogCloseButton = styled(Button)({ + top: 0, + right: 0, + color: 'var(--mui-palette-text-disabled)', + position: 'absolute', + boxShadow: 'var(--mui-customShadows-xs)', + transform: 'translate(9px, -10px)', + borderRadius: 'var(--mui-shape-customBorderRadius-sm)', + backgroundColor: 'var(--mui-palette-background-paper) !important', + transition: 'transform 0.25s ease-in-out, box-shadow 0.25s ease-in-out', + blockSize: 30, + inlineSize: 30, + minInlineSize: 0, + padding: 0, + '&:hover, &:active': { + transform: 'translate(7px, -5px) !important' + }, + '& i, & svg': { + fontSize: '1.25rem' + } +}) + +export default DialogCloseButton diff --git a/src/components/dialogs/OpenDialogOnElementClick.tsx b/src/components/dialogs/OpenDialogOnElementClick.tsx new file mode 100644 index 0000000..0dfdc5a --- /dev/null +++ b/src/components/dialogs/OpenDialogOnElementClick.tsx @@ -0,0 +1,40 @@ +'use client' + +// React Imports +import { useState } from 'react' +import type { ComponentType } from 'react' + +type OpenDialogOnElementClickProps = { + element: ComponentType + dialog: ComponentType + elementProps?: any + dialogProps?: any +} + +const OpenDialogOnElementClick = (props: OpenDialogOnElementClickProps) => { + // Props + const { element: Element, dialog: Dialog, elementProps, dialogProps } = props + + // States + const [open, setOpen] = useState(false) + + // Extract onClick from elementProps + const { onClick: elementOnClick, ...restElementProps } = elementProps + + // Handle onClick event + const handleOnClick = (e: MouseEvent) => { + elementOnClick && elementOnClick(e) + setOpen(true) + } + + return ( + <> + {/* Receive element component as prop and we will pass onclick event which changes state to open */} + + {/* Receive dialog component as prop and we will pass open and setOpen props to that component */} + + + ) +} + +export default OpenDialogOnElementClick diff --git a/src/components/dialogs/add-edit-address/index.tsx b/src/components/dialogs/add-edit-address/index.tsx new file mode 100644 index 0000000..c1c6613 --- /dev/null +++ b/src/components/dialogs/add-edit-address/index.tsx @@ -0,0 +1,275 @@ +'use client' + +// React Imports +import { useEffect, useState } from 'react' +import type { ChangeEvent } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' +import Button from '@mui/material/Button' +import Typography from '@mui/material/Typography' +import Grid from '@mui/material/Grid2' +import MenuItem from '@mui/material/MenuItem' +import Switch from '@mui/material/Switch' +import FormControlLabel from '@mui/material/FormControlLabel' + +// Third-party Imports +import classnames from 'classnames' + +// Type Import +import type { CustomInputVerticalData } from '@core/components/custom-inputs/types' + +// Component Imports +import CustomInputVertical from '@core/components/custom-inputs/Vertical' +import DialogCloseButton from '../DialogCloseButton' +import CustomTextField from '@core/components/mui/TextField' + +type AddEditAddressData = { + firstName?: string + lastName?: string + country?: string + address1?: string + address2?: string + landmark?: string + city?: string + state?: string + zipCode?: string +} + +type AddEditAddressProps = { + open: boolean + setOpen: (open: boolean) => void + data?: AddEditAddressData +} + +const countries = ['Select Country', 'France', 'Russia', 'China', 'UK', 'US'] + +const initialAddressData: AddEditAddressProps['data'] = { + firstName: '', + lastName: '', + country: '', + address1: '', + address2: '', + landmark: '', + city: '', + state: '', + zipCode: '' +} + +const customInputData: CustomInputVerticalData[] = [ + { + title: 'Home', + content: 'Delivery Time (7am - 9pm)', + value: 'home', + isSelected: true, + asset: 'tabler-home' + }, + { + title: 'Office', + content: 'Delivery Time (10am - 6pm)', + value: 'office', + asset: 'tabler-building-skyscraper' + } +] + +const AddEditAddress = ({ open, setOpen, data }: AddEditAddressProps) => { + // Vars + const initialSelected: string = customInputData?.find(item => item.isSelected)?.value || '' + + // States + const [selected, setSelected] = useState(initialSelected) + const [addressData, setAddressData] = useState(initialAddressData) + + const handleChange = (prop: string | ChangeEvent) => { + if (typeof prop === 'string') { + setSelected(prop) + } else { + setSelected((prop.target as HTMLInputElement).value) + } + } + + useEffect(() => { + setAddressData(data ?? initialAddressData) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]) + + return ( + { + setOpen(false) + setSelected(initialSelected) + }} + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + + {data ? 'Edit Address' : 'Add New Address'} + + {data ? 'Edit Address for future billing' : 'Add address for billing address'} + + + e.preventDefault()}> + + setOpen(false)} disableRipple> + + + + {customInputData.map((item, index) => { + let asset + + if (item.asset && typeof item.asset === 'string') { + asset = + } + + return ( + + + + ) + })} + + setAddressData({ ...addressData, firstName: e.target.value })} + /> + + + setAddressData({ ...addressData, lastName: e.target.value })} + /> + + + setAddressData({ ...addressData, country: e.target.value })} + > + {countries.map((item, index) => ( + + {item} + + ))} + + + + setAddressData({ ...addressData, address1: e.target.value })} + /> + + + setAddressData({ ...addressData, address2: e.target.value })} + /> + + + setAddressData({ ...addressData, landmark: e.target.value })} + /> + + + setAddressData({ ...addressData, city: e.target.value })} + /> + + + setAddressData({ ...addressData, state: e.target.value })} + /> + + + setAddressData({ ...addressData, zipCode: e.target.value })} + /> + + + } label='Make this default shipping address' /> + + + + + + + + + + ) +} + +export default AddEditAddress diff --git a/src/components/dialogs/billing-card/index.tsx b/src/components/dialogs/billing-card/index.tsx new file mode 100644 index 0000000..9300984 --- /dev/null +++ b/src/components/dialogs/billing-card/index.tsx @@ -0,0 +1,147 @@ +'use client' + +// React Imports +import { useEffect, useState } from 'react' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Dialog from '@mui/material/Dialog' +import Button from '@mui/material/Button' +import Switch from '@mui/material/Switch' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' +import FormControlLabel from '@mui/material/FormControlLabel' +import Typography from '@mui/material/Typography' + +// Type Imports +import type { ThemeColor } from '@core/types' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' +import CustomTextField from '@core/components/mui/TextField' + +type BillingCardData = { + cardNumber?: string + name?: string + expiryDate?: string + cardCvv?: string + imgSrc?: string + imgAlt?: string + cardStatus?: string + badgeColor?: ThemeColor +} + +type BillingCardProps = { + open: boolean + setOpen: (open: boolean) => void + data?: BillingCardData +} + +const initialCardData: BillingCardProps['data'] = { + cardNumber: '', + name: '', + expiryDate: '', + cardCvv: '', + imgSrc: '', + imgAlt: '', + cardStatus: '', + badgeColor: 'primary' +} + +const BillingCard = ({ open, setOpen, data }: BillingCardProps) => { + // States + const [cardData, setCardData] = useState(initialCardData) + + const handleClose = () => { + setOpen(false) + setCardData(initialCardData) + } + + useEffect(() => { + setCardData(data ?? initialCardData) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]) + + return ( + + setOpen(false)} disableRipple> + + + + {data ? 'Edit Card' : 'Add New Card'} + + {data ? 'Edit your saved card details' : 'Add card for future billing'} + + +
e.preventDefault()}> + + + + setCardData({ ...cardData, cardNumber: e.target.value })} + /> + + + setCardData({ ...cardData, name: e.target.value })} + /> + + + setCardData({ ...cardData, expiryDate: e.target.value })} + /> + + + setCardData({ ...cardData, cardCvv: e.target.value })} + /> + + + } label='Save Card for future billing?' /> + + + + + + + +
+
+ ) +} + +export default BillingCard diff --git a/src/components/dialogs/confirmation-dialog/index.tsx b/src/components/dialogs/confirmation-dialog/index.tsx new file mode 100644 index 0000000..16b226a --- /dev/null +++ b/src/components/dialogs/confirmation-dialog/index.tsx @@ -0,0 +1,139 @@ +'use client' + +// React Imports +import { Fragment, useState } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' +import Typography from '@mui/material/Typography' +import Button from '@mui/material/Button' + +// Third-party Imports +import classnames from 'classnames' + +type ConfirmationType = 'delete-account' | 'unsubscribe' | 'suspend-account' | 'delete-order' | 'delete-customer' + +type ConfirmationDialogProps = { + open: boolean + setOpen: (open: boolean) => void + type: ConfirmationType +} + +const ConfirmationDialog = ({ open, setOpen, type }: ConfirmationDialogProps) => { + // States + const [secondDialog, setSecondDialog] = useState(false) + const [userInput, setUserInput] = useState(false) + + // Vars + const Wrapper = type === 'suspend-account' ? 'div' : Fragment + + const handleSecondDialogClose = () => { + setSecondDialog(false) + setOpen(false) + } + + const handleConfirmation = (value: boolean) => { + setUserInput(value) + setSecondDialog(true) + setOpen(false) + } + + return ( + <> + setOpen(false)} closeAfterTransition={false}> + + + + + {type === 'delete-account' && 'Are you sure you want to deactivate your account?'} + {type === 'unsubscribe' && 'Are you sure to cancel your subscription?'} + {type === 'suspend-account' && 'Are you sure?'} + {type === 'delete-order' && 'Are you sure?'} + {type === 'delete-customer' && 'Are you sure?'} + + {type === 'suspend-account' && ( + You won't be able to revert user! + )} + {type === 'delete-order' && ( + You won't be able to revert order! + )} + {type === 'delete-customer' && ( + You won't be able to revert customer! + )} + + + + + + + + + {/* Delete Account Dialog */} + + + + + {userInput + ? `${type === 'delete-account' ? 'Deactivated' : type === 'unsubscribe' ? 'Unsubscribed' : type === 'delete-order' || 'delete-customer' ? 'Deleted' : 'Suspended!'}` + : 'Cancelled'} + + + {userInput ? ( + <> + {type === 'delete-account' && 'Your account has been deactivated successfully.'} + {type === 'unsubscribe' && 'Your subscription cancelled successfully.'} + {type === 'suspend-account' && 'User has been suspended.'} + {type === 'delete-order' && 'Your order deleted successfully.'} + {type === 'delete-customer' && 'Your customer removed successfully.'} + + ) : ( + <> + {type === 'delete-account' && 'Account Deactivation Cancelled!'} + {type === 'unsubscribe' && 'Unsubscription Cancelled!!'} + {type === 'suspend-account' && 'Cancelled Suspension :)'} + {type === 'delete-order' && 'Order Deletion Cancelled'} + {type === 'delete-customer' && 'Customer Deletion Cancelled'} + + )} + + + + + + + + ) +} + +export default ConfirmationDialog diff --git a/src/components/dialogs/create-app/Billing.tsx b/src/components/dialogs/create-app/Billing.tsx new file mode 100644 index 0000000..0710f72 --- /dev/null +++ b/src/components/dialogs/create-app/Billing.tsx @@ -0,0 +1,112 @@ +// React Imports +import { useState } from 'react' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import FormControlLabel from '@mui/material/FormControlLabel' +import Switch from '@mui/material/Switch' +import Button from '@mui/material/Button' +import Typography from '@mui/material/Typography' + +// Component Imports +import CustomTextField from '@core/components/mui/TextField' +import DirectionalIcon from '@components/DirectionalIcon' + +type Props = { + activeStep: number + isLastStep: boolean + handleNext: () => void + handlePrev: () => void +} + +const Billing = ({ activeStep, isLastStep, handleNext, handlePrev }: Props) => { + // States + const [cardData, setCardData] = useState({ + number: '', + name: '', + expiry: '', + cvv: '' + }) + + return ( +
+ Payment Details + + + setCardData({ ...cardData, number: e.target.value })} + /> + + + setCardData({ ...cardData, name: e.target.value })} + /> + + + setCardData({ ...cardData, expiry: e.target.value })} + /> + + + setCardData({ ...cardData, cvv: e.target.value })} + /> + + + } label='Save Card for future billing?' /> + + + + + + +
+ ) +} + +export default Billing diff --git a/src/components/dialogs/create-app/Database.tsx b/src/components/dialogs/create-app/Database.tsx new file mode 100644 index 0000000..036ef60 --- /dev/null +++ b/src/components/dialogs/create-app/Database.tsx @@ -0,0 +1,114 @@ +// React Imports +import { useState } from 'react' +import type { ChangeEvent } from 'react' + +// MUI Imports +import Typography from '@mui/material/Typography' +import Radio from '@mui/material/Radio' +import Button from '@mui/material/Button' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' +import CustomTextField from '@core/components/mui/TextField' +import DirectionalIcon from '@components/DirectionalIcon' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +type Props = { + activeStep: number + isLastStep: boolean + handleNext: () => void + handlePrev: () => void +} + +const DataBase = ({ activeStep, isLastStep, handleNext, handlePrev }: Props) => { + // States + const [value, setValue] = useState('firebase') + + const handleChange = (event: ChangeEvent) => { + setValue(event.target.value) + } + + return ( +
+ +
+ Select Database Engine +
setValue('firebase')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + firebase + +
+ + Firebase + + Cloud Firestore +
+
+ +
+
setValue('aws')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + aws + +
+ + AWS + + Amazon Fast NoSQL Database +
+
+ +
+
setValue('sql')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + + +
+ + MySQL + + Basic MySQL database +
+
+ +
+
+
+ + +
+
+ ) +} + +export default DataBase diff --git a/src/components/dialogs/create-app/Details.tsx b/src/components/dialogs/create-app/Details.tsx new file mode 100644 index 0000000..50edf0e --- /dev/null +++ b/src/components/dialogs/create-app/Details.tsx @@ -0,0 +1,110 @@ +// React Imports +import { useState } from 'react' +import type { ChangeEvent } from 'react' + +// MUI Imports +import Radio from '@mui/material/Radio' +import Typography from '@mui/material/Typography' +import Button from '@mui/material/Button' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' +import CustomTextField from '@core/components/mui/TextField' +import DirectionalIcon from '@components/DirectionalIcon' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +type Props = { + activeStep: number + isLastStep: boolean + handleNext: () => void + handlePrev: () => void +} + +const Details = ({ activeStep, isLastStep, handleNext, handlePrev }: Props) => { + // States + const [value, setValue] = useState('crm') + + const handleChange = (event: ChangeEvent) => { + setValue(event.target.value) + } + + return ( +
+ +
+ Category +
setValue('crm')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + + +
+ + CRM Application + + Scales with any business +
+
+ +
+
setValue('eCommerce')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + + +
+ + eCommerce Platforms + + Grow Your Business With App +
+
+ +
+
setValue('learning')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + + +
+ + Online Learning platform + + Start learning today +
+
+ +
+
+
+ + +
+
+ ) +} + +export default Details diff --git a/src/components/dialogs/create-app/FrameWork.tsx b/src/components/dialogs/create-app/FrameWork.tsx new file mode 100644 index 0000000..3c4390d --- /dev/null +++ b/src/components/dialogs/create-app/FrameWork.tsx @@ -0,0 +1,120 @@ +// React Imports +import { useState } from 'react' +import type { ChangeEvent } from 'react' + +// MUI Imports +import Typography from '@mui/material/Typography' +import Radio from '@mui/material/Radio' +import Button from '@mui/material/Button' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' +import DirectionalIcon from '@components/DirectionalIcon' + +type Props = { + activeStep: number + isLastStep: boolean + handleNext: () => void + handlePrev: () => void +} + +const FrameWork = ({ activeStep, isLastStep, handleNext, handlePrev }: Props) => { + // States + const [value, setValue] = useState('react') + + const handleChange = (event: ChangeEvent) => { + setValue(event.target.value) + } + + return ( +
+
+ Select Framework +
setValue('react')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + react + +
+ + React Native + + Create truly native apps +
+
+ +
+ +
setValue('angular')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + angular + +
+ + Angular + + Most suited for your application +
+
+ +
+
setValue('vuejs')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + vue + +
+ + Vue + + Progressive Framework +
+
+ +
+
setValue('laravel')} className='flex items-center justify-between cursor-pointer gap-4'> +
+ + laravel + +
+ + Laravel + + PHP web frameworks +
+
+ +
+
+
+ + +
+
+ ) +} + +export default FrameWork diff --git a/src/components/dialogs/create-app/Submit.tsx b/src/components/dialogs/create-app/Submit.tsx new file mode 100644 index 0000000..581a07f --- /dev/null +++ b/src/components/dialogs/create-app/Submit.tsx @@ -0,0 +1,54 @@ +// MUI Imports +import Typography from '@mui/material/Typography' +import Button from '@mui/material/Button' + +// Component Imports +import DirectionalIcon from '@components/DirectionalIcon' + +type Props = { + activeStep: number + isLastStep: boolean + handleNext: () => void + handlePrev: () => void +} + +const Submit = ({ activeStep, isLastStep, handleNext, handlePrev }: Props) => { + return ( +
+
+
+ Submit + Submit to kickstart your project. +
+ submit-img +
+
+ + +
+
+ ) +} + +export default Submit diff --git a/src/components/dialogs/create-app/index.tsx b/src/components/dialogs/create-app/index.tsx new file mode 100644 index 0000000..2882ab0 --- /dev/null +++ b/src/components/dialogs/create-app/index.tsx @@ -0,0 +1,182 @@ +'use client' + +// React Imports +import { useState } from 'react' + +// MUI Imports +import { styled } from '@mui/material/styles' +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Typography from '@mui/material/Typography' +import MuiStep from '@mui/material/Step' +import StepLabel from '@mui/material/StepLabel' +import Stepper from '@mui/material/Stepper' +import type { StepProps } from '@mui/material/Step' + +// Third-party Imports +import classnames from 'classnames' + +// Component Imports +import Billing from './Billing' +import CustomAvatar from '@core/components/mui/Avatar' +import Details from './Details' +import DialogCloseButton from '../DialogCloseButton' +import Database from './Database' +import FrameWork from './FrameWork' +import Submit from './Submit' + +// Styled Component Imports +import StepperWrapper from '@core/styles/stepper' + +type CreateAppProps = { + open: boolean + setOpen: (open: boolean) => void +} + +type stepperProps = { + icon: string + title: string + subtitle: string + active?: boolean +} + +const steps: stepperProps[] = [ + { + icon: 'tabler-file-text', + title: 'Details', + subtitle: 'Enter Details' + }, + { + icon: 'tabler-id', + title: 'FrameWorks', + subtitle: 'Select Framework', + active: true + }, + { + icon: 'tabler-database', + title: 'Database', + subtitle: 'Select Database' + }, + { + icon: 'tabler-credit-card', + title: 'Billing', + subtitle: 'Payment Details' + }, + { + icon: 'tabler-check', + title: 'Submit', + subtitle: 'Submit' + } +] + +const Step = styled(MuiStep)({ + '&.Mui-completed .step-title , &.Mui-completed .step-subtitle': { + color: 'var(--mui-palette-text-disabled)' + } +}) + +const renderStepCount = (activeStep: number, isLastStep: boolean, handleNext: () => void, handlePrev: () => void) => { + const Tag = + activeStep === 0 + ? Details + : activeStep === 1 + ? FrameWork + : activeStep === 2 + ? Database + : activeStep === 3 + ? Billing + : Submit + + return +} + +const CreateApp = ({ open, setOpen }: CreateAppProps) => { + // States + const [activeStep, setActiveStep] = useState(0) + + const handleClose = () => { + setOpen(false) + setActiveStep(0) + } + + const handleStep = (step: number) => () => { + setActiveStep(step) + } + + // Vars + const isLastStep = activeStep === steps.length - 1 + + const handleNext = () => { + if (!isLastStep) { + setActiveStep(prevActiveStep => prevActiveStep + 1) + } else { + handleClose() + } + } + + const handlePrev = () => { + setActiveStep(prevActiveStep => prevActiveStep - 1) + } + + return ( + + setOpen(false)} disableRipple> + + + + Create App + + Provide data with this form to create your app. + + + +
+ + } + className='flex flex-col gap-4 min-is-[220px]' + > + {steps.map((label, index) => { + return ( + + } className='p-1 cursor-pointer'> +
+ = index && { color: 'primary' })} + {...(activeStep === index && { className: 'shadow-primarySm' })} + size={38} + > + + +
+ {label.title} + {label.subtitle} +
+
+
+
+ ) + })} +
+
+
{renderStepCount(activeStep, isLastStep, handleNext, handlePrev)}
+
+
+
+ ) +} + +export default CreateApp diff --git a/src/components/dialogs/edit-user-info/index.tsx b/src/components/dialogs/edit-user-info/index.tsx new file mode 100644 index 0000000..e17a745 --- /dev/null +++ b/src/components/dialogs/edit-user-info/index.tsx @@ -0,0 +1,224 @@ +'use client' + +// React Imports +import { useState } from 'react' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Dialog from '@mui/material/Dialog' +import Button from '@mui/material/Button' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' +import Chip from '@mui/material/Chip' +import MenuItem from '@mui/material/MenuItem' +import Typography from '@mui/material/Typography' +import Switch from '@mui/material/Switch' +import { FormControlLabel } from '@mui/material' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' +import CustomTextField from '@core/components/mui/TextField' + +type EditUserInfoData = { + firstName?: string + lastName?: string + userName?: string + billingEmail?: string + status?: string + taxId?: string + contact?: string + language?: string[] + country?: string + useAsBillingAddress?: boolean +} + +type EditUserInfoProps = { + open: boolean + setOpen: (open: boolean) => void + data?: EditUserInfoData +} + +const initialData: EditUserInfoProps['data'] = { + firstName: 'Oliver', + lastName: 'Queen', + userName: 'oliverQueen', + billingEmail: 'oliverQueen@gmail.com', + status: 'active', + taxId: 'Tax-8894', + contact: '+ 1 609 933 4422', + language: ['English'], + country: 'US', + useAsBillingAddress: true +} + +const status = ['Status', 'Active', 'Inactive', 'Suspended'] + +const languages = ['English', 'Spanish', 'French', 'German', 'Hindi'] + +const countries = ['Select Country', 'France', 'Russia', 'China', 'UK', 'US'] + +const EditUserInfo = ({ open, setOpen, data }: EditUserInfoProps) => { + // States + const [userData, setUserData] = useState(data || initialData) + + const handleClose = () => { + setOpen(false) + setUserData(data || initialData) + } + + return ( + + setOpen(false)} disableRipple> + + + + Edit User Information + + Updating user details will receive a privacy audit. + + +
e.preventDefault()}> + + + + setUserData({ ...userData, firstName: e.target.value })} + /> + + + setUserData({ ...userData, lastName: e.target.value })} + /> + + + setUserData({ ...userData, userName: e.target.value })} + /> + + + setUserData({ ...userData, billingEmail: e.target.value })} + /> + + + setUserData({ ...userData, status: e.target.value as string })} + > + {status.map((status, index) => ( + + {status} + + ))} + + + + setUserData({ ...userData, taxId: e.target.value })} + /> + + + setUserData({ ...userData, contact: e.target.value })} + /> + + + lang.toLowerCase().replace(/\s+/g, '-')) || []} + slotProps={{ + select: { + multiple: true, + onChange: e => setUserData({ ...userData, language: e.target.value as string[] }), + renderValue: selected => ( +
+ {(selected as string[]).map(value => ( + + ))} +
+ ) + } + }} + > + {languages.map((language, index) => ( + + {language} + + ))} +
+
+ + setUserData({ ...userData, country: e.target.value as string })} + > + {countries.map((country, index) => ( + + {country} + + ))} + + + + } + label='Use as a billing address?' + /> + +
+
+ + + + +
+
+ ) +} + +export default EditUserInfo diff --git a/src/components/dialogs/payment-method/index.tsx b/src/components/dialogs/payment-method/index.tsx new file mode 100644 index 0000000..13dc9fe --- /dev/null +++ b/src/components/dialogs/payment-method/index.tsx @@ -0,0 +1,122 @@ +'use client' + +// MUI Imports +import Avatar from '@mui/material/Avatar' +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' +import DialogTitle from '@mui/material/DialogTitle' +import Typography from '@mui/material/Typography' +import { useColorScheme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' + +type PaymentMethodProps = { + open: boolean + setOpen: (open: boolean) => void +} + +type CardList = { + image: string + imgWidth: string + imgHeight?: string + alt: string + cardName: string + cardType: string +} + +const cardList: CardList[] = [ + { + image: '/images/logos/visa.png', + imgWidth: '30px', + alt: 'visa card', + cardName: 'Visa', + cardType: 'Credit Card' + }, + { + image: '/images/logos/american-express.png', + imgWidth: '36px', + alt: 'American Express', + cardName: 'American Express', + cardType: 'Credit Card' + }, + { + image: '/images/logos/mastercard.png', + imgWidth: '30px', + alt: 'Mastercard', + cardName: 'Mastercard', + cardType: 'Credit Card' + }, + { + image: '/images/logos/jcb.png', + imgWidth: '21.4px', + alt: 'JCB', + cardName: 'JCB', + cardType: 'Credit Card' + }, + { + image: '/images/logos/dinners-club.png', + imgWidth: '20px', + alt: 'Dinners Club', + cardName: 'Dinners Club', + cardType: 'Credit Card' + } +] + +const PaymentMethod = ({ open, setOpen }: PaymentMethodProps) => { + // Hooks + const { mode } = useColorScheme() + + return ( + setOpen(false)} + maxWidth='sm' + scroll='body' + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + setOpen(false)} disableRipple> + + + + Select Payment Methods + + Supported payment methods + + + +
+ {cardList?.map((card, index) => ( +
+
+ + {card.alt} + + + {card.cardName} + +
+ {card.cardType} +
+ ))} +
+
+
+ ) +} + +export default PaymentMethod diff --git a/src/components/dialogs/payment-providers/index.tsx b/src/components/dialogs/payment-providers/index.tsx new file mode 100644 index 0000000..544e82d --- /dev/null +++ b/src/components/dialogs/payment-providers/index.tsx @@ -0,0 +1,252 @@ +'use client' + +// MUI Imports +import Avatar from '@mui/material/Avatar' +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' +import DialogTitle from '@mui/material/DialogTitle' +import Typography from '@mui/material/Typography' +import { useColorScheme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' + +type PaymentProvidersProps = { + open: boolean + setOpen: (open: boolean) => void +} + +type Image = { + src: string + alt?: string + height?: string + width?: string +} + +type CardList = { + images: Image[] + providerName: string +} + +const cardList: CardList[] = [ + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/mastercard.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + }, + { + src: '/images/logos/dinners-club.png', + height: '16px' + } + ], + providerName: 'Adyen' + }, + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + }, + { + src: '/images/logos/dinners-club.png', + height: '16px' + } + ], + providerName: '2Checkout' + }, + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/mastercard.png', + width: '30px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + } + ], + providerName: 'Airpay' + }, + { + images: [ + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + }, + { + src: '/images/logos/dinners-club.png', + height: '16px' + } + ], + providerName: 'Authorize.net' + }, + { + images: [ + { + src: '/images/logos/mastercard.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + } + ], + providerName: 'Bambora' + }, + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/mastercard.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + }, + { + src: '/images/logos/dinners-club.png', + height: '16px' + } + ], + providerName: 'Cayan' + }, + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/american-express.png', + width: '36px' + }, + { + src: '/images/logos/jcb.png', + height: '16px' + }, + { + src: '/images/logos/dinners-club.png', + height: '16px' + } + ], + providerName: 'Chase Paymentech (Orbital)' + }, + { + images: [ + { + src: '/images/logos/visa.png', + width: '30px' + }, + { + src: '/images/logos/mastercard.png', + width: '30px' + } + ], + providerName: 'Checkout.com' + } +] + +const PaymentProviders = ({ open, setOpen }: PaymentProvidersProps) => { + // Hooks + const { mode } = useColorScheme() + + return ( + setOpen(false)} + maxWidth='md' + scroll='body' + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + setOpen(false)} disableRipple> + + + + Select Payment Providers + + Third-party payment providers + + + +
+ {cardList?.map((card, index) => ( +
+ + {card.providerName} + +
+ {card.images.map((image, index) => ( + + {image.alt} + + ))} +
+
+ ))} +
+
+
+ ) +} + +export default PaymentProviders diff --git a/src/components/dialogs/permission-dialog/index.tsx b/src/components/dialogs/permission-dialog/index.tsx new file mode 100644 index 0000000..54413d3 --- /dev/null +++ b/src/components/dialogs/permission-dialog/index.tsx @@ -0,0 +1,105 @@ +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import DialogActions from '@mui/material/DialogActions' +import Typography from '@mui/material/Typography' +import Button from '@mui/material/Button' +import Checkbox from '@mui/material/Checkbox' +import FormControlLabel from '@mui/material/FormControlLabel' +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' + +// Component Imports +import CustomTextField from '@core/components/mui/TextField' +import DialogCloseButton from '../DialogCloseButton' + +type PermissionDialogProps = { + open: boolean + setOpen: (open: boolean) => void + data?: string +} + +type EditProps = { + handleClose: () => void + data: string +} + +const AddContent = ({ handleClose }: { handleClose: () => void }) => { + return ( + <> + + + } label='Set as core permission' /> + + + + + + + ) +} + +const EditContent = ({ handleClose, data }: EditProps) => { + return ( + + + Warning! + By editing the permission name, you might break the system permissions functionality. Please ensure you're + absolutely certain before proceeding. + +
+ + +
+ } label='Set as core permission' /> +
+ ) +} + +const PermissionDialog = ({ open, setOpen, data }: PermissionDialogProps) => { + const handleClose = () => { + setOpen(false) + } + + return ( + + setOpen(false)} disableRipple> + + + + {data ? 'Edit Permission' : 'Add New Permission'} + + {data ? 'Edit permission as per your requirements.' : 'Permissions you may use and assign to your users.'} + + + {data ? : } + + ) +} + +export default PermissionDialog diff --git a/src/components/dialogs/pricing/index.tsx b/src/components/dialogs/pricing/index.tsx new file mode 100644 index 0000000..9172223 --- /dev/null +++ b/src/components/dialogs/pricing/index.tsx @@ -0,0 +1,43 @@ +'use client' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogContent from '@mui/material/DialogContent' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' + +// Type Imports +import type { PricingPlanType } from '@/types/pages/pricingTypes' + +// Component Imports +import Pricing from '@components/pricing' + +type PricingProps = { + open: boolean + setOpen: (open: boolean) => void + data: PricingPlanType[] +} + +const PricingDialog = ({ open, setOpen, data }: PricingProps) => { + return ( + setOpen(false)} + scroll='body' + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + setOpen(false)} disableRipple> + + + + + + + ) +} + +export default PricingDialog diff --git a/src/components/dialogs/refer-earn/index.tsx b/src/components/dialogs/refer-earn/index.tsx new file mode 100644 index 0000000..ebdc5a4 --- /dev/null +++ b/src/components/dialogs/refer-earn/index.tsx @@ -0,0 +1,161 @@ +'use client' + +// React Imports +import type { ReactNode } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Typography from '@mui/material/Typography' +import Grid from '@mui/material/Grid2' +import Divider from '@mui/material/Divider' +import Button from '@mui/material/Button' +import InputAdornment from '@mui/material/InputAdornment' + +// Third-party Imports +import classnames from 'classnames' + +// Component Imports +import CustomIconButton from '@core/components/mui/IconButton' +import CustomTextField from '@core/components/mui/TextField' +import CustomAvatar from '@core/components/mui/Avatar' +import DialogCloseButton from '../DialogCloseButton' +import Keyboard from '@/assets/svg/Keyboard' +import Paper from '@/assets/svg/Paper' +import Rocket from '@/assets/svg/Rocket' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +type ReferEarnProps = { + open: boolean + setOpen: (open: boolean) => void +} + +type Options = { + icon?: ReactNode + title?: string + subtitle?: string +} + +const options: Options[] = [ + { + icon: , + title: 'Send Invitation 👍🏻', + subtitle: 'Send your referral link to your friend' + }, + { + icon: , + title: 'Registration 😎', + subtitle: 'Let them register to our services' + }, + { + icon: , + title: 'Free Trial 🎉', + subtitle: 'Your friend will get 30 days free trial' + } +] + +const ReferEarn = ({ open, setOpen }: ReferEarnProps) => { + return ( + setOpen(false)} + maxWidth='md' + scroll='body' + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + setOpen(false)} disableRipple> + + + + Refer & Earn + + {`Invite your friend to ${themeConfig.templateName}, if they sign up, you and your friend will get 30 days free + trial`} + + + + + {options?.map((option, index) => ( + +
+ + {typeof option.icon === 'string' ? ( + + ) : ( + option.icon + )} + +
+ {option.title} + {option.subtitle} +
+
+
+ ))} +
+ +
+ Invite your friends +
+ + +
+
+
+ Share the referral link +
+ + + + ) + } + }} + /> +
+ + + + + + + + + +
+
+
+
+
+ ) +} + +export default ReferEarn diff --git a/src/components/dialogs/role-dialog/index.tsx b/src/components/dialogs/role-dialog/index.tsx new file mode 100644 index 0000000..0270ca1 --- /dev/null +++ b/src/components/dialogs/role-dialog/index.tsx @@ -0,0 +1,251 @@ +'use client' + +// React Imports +import { useState, useEffect } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Typography from '@mui/material/Typography' +import Checkbox from '@mui/material/Checkbox' +import FormGroup from '@mui/material/FormGroup' +import FormControlLabel from '@mui/material/FormControlLabel' +import DialogActions from '@mui/material/DialogActions' +import Button from '@mui/material/Button' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' +import CustomTextField from '@core/components/mui/TextField' + +// Style Imports +import tableStyles from '@core/styles/table.module.css' + +type RoleDialogProps = { + open: boolean + setOpen: (open: boolean) => void + title?: string +} + +type DataType = + | string + | { + title: string + read?: boolean + write?: boolean + select?: boolean + } + +const defaultData: DataType[] = [ + 'User Management', + 'Content Management', + 'Disputes Management', + 'Database Management', + 'Financial Management', + 'Reporting', + 'API Control', + 'Repository Management', + 'Payroll' +] + +const RoleDialog = ({ open, setOpen, title }: RoleDialogProps) => { + // States + const [selectedCheckbox, setSelectedCheckbox] = useState( + title + ? [ + 'user-management-read', + 'user-management-write', + 'user-management-create', + 'disputes-management-read', + 'disputes-management-write', + 'disputes-management-create' + ] + : [] + ) + + const [isIndeterminateCheckbox, setIsIndeterminateCheckbox] = useState(false) + + const handleClose = () => { + setOpen(false) + } + + const togglePermission = (id: string) => { + const arr = selectedCheckbox + + if (selectedCheckbox.includes(id)) { + arr.splice(arr.indexOf(id), 1) + setSelectedCheckbox([...arr]) + } else { + arr.push(id) + setSelectedCheckbox([...arr]) + } + } + + const handleSelectAllCheckbox = () => { + if (isIndeterminateCheckbox) { + setSelectedCheckbox([]) + } else { + defaultData.forEach(row => { + const id = (typeof row === 'string' ? row : row.title).toLowerCase().split(' ').join('-') + + togglePermission(`${id}-read`) + togglePermission(`${id}-write`) + togglePermission(`${id}-create`) + }) + } + } + + useEffect(() => { + if (selectedCheckbox.length > 0 && selectedCheckbox.length < defaultData.length * 3) { + setIsIndeterminateCheckbox(true) + } else { + setIsIndeterminateCheckbox(false) + } + }, [selectedCheckbox]) + + return ( + + setOpen(false)} disableRipple> + + + + {title ? 'Edit Role' : 'Add Role'} + + Set Role Permissions + + +
e.preventDefault()}> + + e.target.value} + /> + + Role Permissions + +
+ + + + + + + {defaultData.map((item, index) => { + const id = (typeof item === 'string' ? item : item.title).toLowerCase().split(' ').join('-') + + return ( + + + + + ) + })} + +
+ + Administrator Access + + + + } + label='Select All' + /> +
+ + {typeof item === 'object' ? item.title : item} + + + {typeof item === 'object' ? ( + + } + label='Read' + /> + } + label='Write' + /> + } + label='Select' + /> + + ) : ( + + togglePermission(`${id}-read`)} + checked={selectedCheckbox.includes(`${id}-read`)} + /> + } + label='Read' + /> + togglePermission(`${id}-write`)} + checked={selectedCheckbox.includes(`${id}-write`)} + /> + } + label='Write' + /> + togglePermission(`${id}-create`)} + checked={selectedCheckbox.includes(`${id}-create`)} + /> + } + label='Create' + /> + + )} +
+
+
+ + + + +
+
+ ) +} + +export default RoleDialog diff --git a/src/components/dialogs/share-project/index.tsx b/src/components/dialogs/share-project/index.tsx new file mode 100644 index 0000000..be35a90 --- /dev/null +++ b/src/components/dialogs/share-project/index.tsx @@ -0,0 +1,253 @@ +'use client' + +// React Imports +import { useState } from 'react' +import type { MouseEvent } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Button from '@mui/material/Button' +import IconButton from '@mui/material/IconButton' +import Typography from '@mui/material/Typography' +import Avatar from '@mui/material/Avatar' +import List from '@mui/material/List' +import ListItem from '@mui/material/ListItem' +import ListItemAvatar from '@mui/material/ListItemAvatar' +import ListItemText from '@mui/material/ListItemText' +import Menu from '@mui/material/Menu' +import MenuItem from '@mui/material/MenuItem' + +// Component Imports +import DialogCloseButton from '../DialogCloseButton' +import CustomAutocomplete from '@core/components/mui/Autocomplete' +import CustomTextField from '@core/components/mui/TextField' +import CustomAvatar from '@core/components/mui/Avatar' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +type ShareProjectProps = { + open: boolean + setOpen: (open: boolean) => void +} + +type OptionsType = { + avatar: string + name: string +} + +type DataType = { + avatar: string + value: string + name: string + email: string +} + +const data: DataType[] = [ + { + avatar: '1.png', + value: 'Can Edit', + name: 'Lester Palmer', + email: 'lester.palmer@gmail.com' + }, + { + avatar: '2.png', + value: 'Owner', + name: 'Mittie Blair', + email: 'mittie.blair@gmail.com' + }, + { + avatar: '3.png', + value: 'Can Comment', + name: 'Marvin Wheeler', + email: 'marvin.wheeler@gmail.com' + }, + { + avatar: '4.png', + value: 'Can View', + name: 'Nannie Ford', + email: 'nannie.ford@gmail.com' + }, + { + avatar: '5.png', + value: 'Can Edit', + name: 'Julian Murphy', + email: 'julian.murphy@gmail.com' + }, + { + avatar: '6.png', + value: 'Can View', + name: 'Sophie Gilbert', + email: 'sophie.gilbert@gmail.com' + }, + { + avatar: '7.png', + value: 'Can Comment', + name: 'Chris Watkins', + email: 'chris.watkins@gmail.com' + }, + { + avatar: '8.png', + value: 'Can Edit', + name: 'Adelaide Nichols', + email: 'adelaide.nichols@gmail.com' + } +] + +const autocompleteOptions: OptionsType[] = [ + { + avatar: '1.png', + name: 'Chandler Bing' + }, + { + avatar: '2.png', + name: 'Rachel Green' + }, + { + avatar: '3.png', + name: 'Joey Tribbiani' + }, + { + avatar: '4.png', + name: 'Pheobe Buffay' + }, + { + avatar: '5.png', + name: 'Ross Geller' + }, + { + avatar: '8.png', + name: 'Monica Geller' + } +] + +const ShareProject = ({ open, setOpen }: ShareProjectProps) => { + // States + const [anchorEl, setAnchorEl] = useState(null) + + const handleClick = (event: MouseEvent) => { + setAnchorEl(event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + return ( + setOpen(false)} + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + setOpen(false)} disableRipple> + + + + Share Project + + Share project with the team members + + + +
+ option.name} + renderInput={params => ( + + )} + renderOption={(props, option) => { + const { key, ...rest } = props + + return ( + + + + + + + ) + }} + /> +
+
+ {`${data.length} Members`} +
+ {data.map((member, index) => ( +
+ +
+
+ + {member.name} + + + {member.email} + +
+ + + + + + +
+
+ ))} + + + Owner + + + Can Edit + + + Can Comment + + + Can View + + +
+
+
+
+ + {`Public to ${themeConfig.templateName} - Pixinvent`} +
+ +
+
+
+ ) +} + +export default ShareProject diff --git a/src/components/dialogs/two-factor-auth/index.tsx b/src/components/dialogs/two-factor-auth/index.tsx new file mode 100644 index 0000000..62ea997 --- /dev/null +++ b/src/components/dialogs/two-factor-auth/index.tsx @@ -0,0 +1,241 @@ +'use client' + +// React Imports +import { useState } from 'react' +import type { ChangeEvent } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogActions from '@mui/material/DialogActions' +import DialogContent from '@mui/material/DialogContent' +import Grid from '@mui/material/Grid2' +import Button from '@mui/material/Button' +import Typography from '@mui/material/Typography' +import Alert from '@mui/material/Alert' +import AlertTitle from '@mui/material/AlertTitle' + +// Type Imports +import type { CustomInputHorizontalData } from '@core/components/custom-inputs/types' + +// Component Imports +import CustomInputHorizontal from '@core/components/custom-inputs/Horizontal' +import DialogCloseButton from '../DialogCloseButton' +import CustomTextField from '@core/components/mui/TextField' + +type TwoFactorAuthProps = { + open: boolean + setOpen: (open: boolean) => void +} + +const data: CustomInputHorizontalData[] = [ + { + title: ( +
+ + + Authenticator Apps + +
+ ), + value: 'app', + isSelected: true, + content: 'Get code from an app like Google Authenticator or Microsoft Authenticator.' + }, + { + title: ( +
+ + + SMS + +
+ ), + value: 'sms', + content: 'We will send a code via SMS if you need to use your backup login method.' + } +] + +const SMSDialog = (handleAuthDialogClose: () => void) => { + return ( + <> + + Verify Your Mobile Number for SMS + + Enter your mobile phone number with country code and we will send you a verification code. + + + + + + + + + + + ) +} + +const AppDialog = (handleAuthDialogClose: () => void) => { + return ( + <> + + Add Authenticator App + + +
+ Authenticator Apps + + Using an authenticator app like Google Authenticator, Microsoft Authenticator, Authy, or 1Password, scan the + QR code. It will generate a 6 digit code for you to enter below. + +
+
+ qr-code +
+
+ + ASDLKNASDA9AHS678dGhASD78AB + If you having trouble using the QR code, select manual entry on your app + + +
+
+ + + + + + ) +} + +const TwoFactorAuth = ({ open, setOpen }: TwoFactorAuthProps) => { + // Vars + const initialSelectedOption: string = data.filter(item => item.isSelected)[ + data.filter(item => item.isSelected).length - 1 + ].value + + // States + const [authType, setAuthType] = useState(initialSelectedOption) + const [showAuthDialog, setShowAuthDialog] = useState(false) + + const handleClose = () => { + setOpen(false) + + if (authType !== 'app') { + setAuthType('app') + } + } + + const handleAuthDialogClose = () => { + setShowAuthDialog(false) + setShowAuthDialog(false) + + if (authType !== 'app') { + setTimeout(() => { + setAuthType('app') + }, 250) + } + } + + const handleOptionChange = (prop: string | ChangeEvent) => { + if (typeof prop === 'string') { + setAuthType(prop) + } else { + setAuthType((prop.target as HTMLInputElement).value) + } + } + + return ( + <> + setOpen(false)} + closeAfterTransition={false} + sx={{ '& .MuiDialog-paper': { overflow: 'visible' } }} + > + + + + + Select Authentication Method + + You also need to select a method by which the proxy authenticates to the directory serve. + + + + + {data.map((item, index) => ( + + ))} + + + + + + + + + + + + +
e.preventDefault()}> + {authType === 'sms' ? SMSDialog(handleAuthDialogClose) : AppDialog(handleAuthDialogClose)} +
+
+ + ) +} + +export default TwoFactorAuth diff --git a/src/components/dialogs/upgrade-plan/index.tsx b/src/components/dialogs/upgrade-plan/index.tsx new file mode 100644 index 0000000..6b9c44d --- /dev/null +++ b/src/components/dialogs/upgrade-plan/index.tsx @@ -0,0 +1,92 @@ +'use client' + +// React Imports +import { useState } from 'react' + +// MUI Imports +import Dialog from '@mui/material/Dialog' +import DialogTitle from '@mui/material/DialogTitle' +import DialogContent from '@mui/material/DialogContent' +import Button from '@mui/material/Button' +import Typography from '@mui/material/Typography' +import MenuItem from '@mui/material/MenuItem' +import Divider from '@mui/material/Divider' + +// Style Imports +import ConfirmationDialog from '../confirmation-dialog' + +//Component Imports +import CustomTextField from '@core/components/mui/TextField' +import DialogCloseButton from '../DialogCloseButton' + +type UpgradePlanProps = { + open: boolean + setOpen: (open: boolean) => void +} + +const UpgradePlan = ({ open, setOpen }: UpgradePlanProps) => { + // States + const [openConfirmation, setOpenConfirmation] = useState(false) + + const handleClose = () => { + setOpen(false) + } + + return ( + <> + + setOpen(false)} disableRipple> + + + + Upgrade Plan + + Choose the best plan for user + + + +
+ + Basic - $0/month + Standard - $99/month + Enterprise - $499/month + Company - $999/month + + +
+ +
+ User current plan is standard plan +
+
+ + $ + + + 99 + + + /month + +
+ +
+
+
+
+ + + ) +} + +export default UpgradePlan diff --git a/src/components/layout/front-pages/DropdownMenu.tsx b/src/components/layout/front-pages/DropdownMenu.tsx new file mode 100644 index 0000000..ea8e0f4 --- /dev/null +++ b/src/components/layout/front-pages/DropdownMenu.tsx @@ -0,0 +1,378 @@ +// React Imports +import { Fragment, useEffect, useState } from 'react' +import type { CSSProperties, MouseEvent, ReactNode } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' + +// MUI Imports +import Typography from '@mui/material/Typography' +import Collapse from '@mui/material/Collapse' + +// Third-party Imports +import classnames from 'classnames' +import { + useFloating, + useDismiss, + useRole, + useInteractions, + useHover, + offset, + flip, + size, + autoUpdate, + FloatingPortal, + safePolygon, + useTransitionStyles +} from '@floating-ui/react' + +// Type Imports +import type { Mode } from '@core/types' + +// Component Imports +import Link from '@components/Link' +import CustomAvatar from '@core/components/mui/Avatar' + +type Props = { + mode: Mode + isBelowLgScreen: boolean + isDrawerOpen: boolean + setIsDrawerOpen: (open: boolean) => void +} + +type MenuWrapperProps = { + children: ReactNode + refs: any + isBelowLgScreen: boolean + isOpen: boolean + getFloatingProps: any + top: number + floatingStyles: CSSProperties + isMounted: boolean + styles: CSSProperties +} + +// Constants +const pageData = [ + { + title: 'Pricing', + href: '/pricing' + }, + { + title: 'Payment', + href: '/payment' + }, + { + title: 'Checkout', + href: '/checkout' + }, + { + title: 'Help Center', + href: '/help-center' + } +] + +const authData = [ + { + title: 'Login (Basic)', + href: '/login-v1' + }, + { + title: 'Login (Cover)', + href: '/login-v2' + }, + { + title: 'Register (Basic)', + href: '/register-v1' + }, + { + title: 'Register (Cover)', + href: '/register-v2' + }, + { + title: 'Register (Multi-steps)', + href: '/register-multi-steps' + }, + { + title: 'Forgot Password (Basic)', + href: '/forgot-password-v1' + }, + { + title: 'Forgot Password (Cover)', + href: '/forgot-password-v2' + }, + { + title: 'Reset Password (Basic)', + href: '/reset-password-v1' + }, + { + title: 'Reset Password (Cover)', + href: '/reset-password-v2' + } +] + +const othersData = [ + { + title: 'Under Maintenance', + href: '/misc/under-maintenance' + }, + { + title: 'Coming Soon', + href: '/misc/coming-soon' + }, + { + title: 'Not Authorized', + href: '/misc/401-not-authorized' + }, + { + title: 'Verify Email (Basic)', + href: '/auth/verify-email-v1' + }, + { + title: 'Verify Email (Cover)', + href: '/auth/verify-email-v2' + }, + { + title: 'Two Steps (Basic)', + href: '/auth/two-steps-v1' + }, + { + title: 'Two Steps (Cover)', + href: '/auth/two-steps-v2' + } +] + +const MenuWrapper = (props: MenuWrapperProps) => { + // Props + const { children, refs, isBelowLgScreen, isOpen, getFloatingProps, top, floatingStyles, isMounted, styles } = props + + if (!isBelowLgScreen) { + return ( + + {isMounted && ( +
+
+ {children} +
+
+ )} +
+ ) + } + + return ( + +
{children}
+
+ ) +} + +const DropdownMenu = (props: Props) => { + // Props + const { isBelowLgScreen, isDrawerOpen, setIsDrawerOpen } = props + + // states + const [isOpen, setIsOpen] = useState(false) + + // hooks + const pathname = usePathname() + + const { y, refs, floatingStyles, context } = useFloating({ + placement: 'bottom', + open: isOpen, + ...(!isBelowLgScreen && { onOpenChange: setIsOpen }), + whileElementsMounted: autoUpdate, + middleware: [ + offset(14), + flip({ padding: 10 }), + size({ + apply({ rects, elements, availableHeight }) { + Object.assign(elements.floating.style, { + maxHeight: `${availableHeight}px`, + minWidth: `${rects.reference.width}px` + }) + }, + padding: 10 + }) + ] + }) + + // Floating UI Transition Styles + const { isMounted, styles } = useTransitionStyles(context, { + // Configure both open and close durations: + duration: 300, + + initial: { + opacity: 0, + transform: 'translateY(10px)' + }, + open: { + opacity: 1, + transform: 'translateY(0px)' + }, + close: { + opacity: 0, + transform: 'translateY(10px)' + } + }) + + const hover = useHover(context, { + handleClose: safePolygon({ + blockPointerEvents: true + }), + restMs: 25, + delay: { open: 75 } + }) + + const dismiss = useDismiss(context) + const role = useRole(context, { role: 'menu' }) + + const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, role, hover]) + + const Tag = isBelowLgScreen ? 'div' : Fragment + + const handleLinkClick = () => { + if (isBelowLgScreen) { + isDrawerOpen && setIsDrawerOpen(false) + } else { + setIsOpen(false) + } + } + + useEffect(() => { + if (!isDrawerOpen && isOpen) { + setIsOpen(false) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isDrawerOpen]) + + return ( + + { + e.preventDefault() + setIsOpen(!isOpen) + } + } + : { + ref: refs.setReference, + ...getReferenceProps() + })} + > + Pages + + + +
+
+ + + + Page +
+ {pageData.map((page, index) => ( + + + {page.title} + + ))} +
+
+
+ + + + Auth Demo +
+ {authData.map((page, index) => ( + + + {page.title} + + ))} +
+
+
+ + + + Auth Demo +
+ {othersData.map((page, index) => ( + + + {page.title} + + ))} +
+ {!isBelowLgScreen && ( +
+ dropdown image +
+ )} +
+
+ ) +} + +export default DropdownMenu diff --git a/src/components/layout/front-pages/Footer.tsx b/src/components/layout/front-pages/Footer.tsx new file mode 100644 index 0000000..54737c9 --- /dev/null +++ b/src/components/layout/front-pages/Footer.tsx @@ -0,0 +1,208 @@ +'use client' + +// MUI Imports +import Grid from '@mui/material/Grid2' +import Typography from '@mui/material/Typography' +import Button from '@mui/material/Button' +import Chip from '@mui/material/Chip' +import IconButton from '@mui/material/IconButton' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Mode } from '@core/types' + +// Component Imports +import Link from '@components/Link' +import Logo from '@components/layout/shared/Logo' +import CustomTextField from '@core/components/mui/TextField' + +// Hooks Imports +import { useImageVariant } from '@core/hooks/useImageVariant' + +// Util Imports +import { frontLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styles Imports +import styles from './styles.module.css' +import frontCommonStyles from '@views/front-pages/styles.module.css' + +const Footer = ({ mode }: { mode: Mode }) => { + // Vars + const footerImageLight = '/images/front-pages/footer-bg-light.png' + const footerImageDark = '/images/front-pages/footer-bg-dark.png' + + // Hooks + const dashboardImage = useImageVariant(mode, footerImageLight, footerImageDark) + + return ( +
+
+ footer bg +
+ + +
+ + + + + Most Powerful & Comprehensive 🤩 React NextJS Admin Template with Elegant Material Design & Unique + Layouts. + +
+ + +
+
+
+ + + Pages + +
+ + Pricing + + + + Payment + + + + + Maintenance + + + Coming Soon + +
+
+ + + Products + +
+ + Page builder + + + Admin Dashboards + + + UI Kits + + + Illustrations + +
+
+ + + Download our App + +
+ +
+ apple store +
+ + Download on the + + + App Store + +
+
+ + +
+ Google play +
+ + Download on the + + + Google Play + +
+
+ +
+
+
+
+
+
+
+ + {`© ${new Date().getFullYear()}, Made with `} + {`❤️`} + {` by `} + + Pixinvent + + +
+ + + + + + + + + + + + +
+
+
+
+ ) +} + +export default Footer diff --git a/src/components/layout/front-pages/FrontMenu.tsx b/src/components/layout/front-pages/FrontMenu.tsx new file mode 100644 index 0000000..2bfef31 --- /dev/null +++ b/src/components/layout/front-pages/FrontMenu.tsx @@ -0,0 +1,165 @@ +'use client' + +// React Imports +import { useEffect } from 'react' + +// Next Imports +import { usePathname } from 'next/navigation' +import Link from 'next/link' + +// MUI Imports +import Typography from '@mui/material/Typography' +import Drawer from '@mui/material/Drawer' +import useMediaQuery from '@mui/material/useMediaQuery' +import type { Theme } from '@mui/material/styles' +import IconButton from '@mui/material/IconButton' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Mode } from '@core/types' + +// Hook Imports +import { useIntersection } from '@/hooks/useIntersection' + +// Component Imports +import DropdownMenu from './DropdownMenu' + +type Props = { + mode: Mode + isDrawerOpen: boolean + setIsDrawerOpen: (open: boolean) => void +} + +type WrapperProps = { + children: React.ReactNode + isBelowLgScreen: boolean + className?: string + isDrawerOpen: boolean + setIsDrawerOpen: (open: boolean) => void +} + +const Wrapper = (props: WrapperProps) => { + // Props + const { children, isBelowLgScreen, className, isDrawerOpen, setIsDrawerOpen } = props + + if (isBelowLgScreen) { + return ( + setIsDrawerOpen(false)} + ModalProps={{ + keepMounted: true + }} + sx={{ '& .MuiDrawer-paper': { width: ['100%', 300] } }} + className={classnames('p-5', className)} + > +
+ setIsDrawerOpen(false)} className='absolute inline-end-4 block-start-2'> + + + {children} +
+
+ ) + } + + return
{children}
+} + +const FrontMenu = (props: Props) => { + // Props + const { isDrawerOpen, setIsDrawerOpen, mode } = props + + // Hooks + const pathname = usePathname() + const isBelowLgScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg')) + const { intersections } = useIntersection() + + useEffect(() => { + if (!isBelowLgScreen && isDrawerOpen) { + setIsDrawerOpen(false) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isBelowLgScreen]) + + return ( + + + Home + + + Features + + + Team + + + FAQ + + + Contact us + + + + Admin + + + ) +} + +export default FrontMenu diff --git a/src/components/layout/front-pages/Header.tsx b/src/components/layout/front-pages/Header.tsx new file mode 100644 index 0000000..d64b0ad --- /dev/null +++ b/src/components/layout/front-pages/Header.tsx @@ -0,0 +1,100 @@ +'use client' + +// React Imports +import { useState } from 'react' + +// Next Imports +import Link from 'next/link' + +// MUI Imports +import Button from '@mui/material/Button' +import IconButton from '@mui/material/IconButton' +import useMediaQuery from '@mui/material/useMediaQuery' +import useScrollTrigger from '@mui/material/useScrollTrigger' +import type { Theme } from '@mui/material/styles' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Mode } from '@core/types' + +// Component Imports +import Logo from '@components/layout/shared/Logo' +import ModeDropdown from '@components/layout/shared/ModeDropdown' +import FrontMenu from './FrontMenu' +import CustomIconButton from '@core/components/mui/IconButton' + +// Util Imports +import { frontLayoutClasses } from '@layouts/utils/layoutClasses' + +// Styles Imports +import styles from './styles.module.css' + +const Header = ({ mode }: { mode: Mode }) => { + // States + const [isDrawerOpen, setIsDrawerOpen] = useState(false) + + // Hooks + const isBelowLgScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg')) + + // Detect window scroll + const trigger = useScrollTrigger({ + threshold: 0, + disableHysteresis: true + }) + + return ( +
+
+
+ {isBelowLgScreen ? ( +
+ setIsDrawerOpen(true)} className='-mis-2'> + + + + + + +
+ ) : ( +
+ + + + +
+ )} +
+ + {isBelowLgScreen ? ( + + + + ) : ( + + )} +
+
+
+
+ ) +} + +export default Header diff --git a/src/components/layout/front-pages/index.tsx b/src/components/layout/front-pages/index.tsx new file mode 100644 index 0000000..d20e778 --- /dev/null +++ b/src/components/layout/front-pages/index.tsx @@ -0,0 +1,27 @@ +// Type Imports +import type { ChildrenType } from '@core/types' + +// Component Imports +import Footer from '@components/layout/front-pages/Footer' +import Header from '@components/layout/front-pages/Header' + +// Server Action Imports +import { getServerMode } from '@core/utils/serverHelpers' + +// Util Imports +import { frontLayoutClasses } from '@layouts/utils/layoutClasses' + +const FrontLayout = async ({ children }: ChildrenType) => { + // Vars + const mode = await getServerMode() + + return ( +
+
+ {children} +
+
+ ) +} + +export default FrontLayout diff --git a/src/components/layout/front-pages/styles.module.css b/src/components/layout/front-pages/styles.module.css new file mode 100644 index 0000000..8674291 --- /dev/null +++ b/src/components/layout/front-pages/styles.module.css @@ -0,0 +1,73 @@ +.header { + position: sticky; + inset-block-start: 0; + z-index: var(--header-z-index); + display: flex; + align-items: center; + justify-content: center; + inline-size: 100%; + pointer-events: none; + + &:before { + content: ''; + position: absolute; + z-index: -1; + inset-block-start: 0; + inset-inline: 0; + block-size: 100%; + backdrop-filter: saturate(100%) blur(6px); + } + + .navbar { + inline-size: calc(100% - 48px); + padding-block: 0.438rem; + padding-inline: 1.5rem; + margin-inline: auto; + margin-block-start: 1rem; + pointer-events: auto; + background-color: rgb(var(--mui-palette-background-paperChannel) / 0.38); + border: 2px solid rgb(var(--mui-palette-background-paperChannel) / 0.68); + border-radius: var(--mui-shape-borderRadius); + + &.headerScrolled { + background-color: var(--mui-palette-background-paper); + border-color: var(--mui-palette-background-paper); + box-shadow: var(--mui-customShadows-sm); + } + + @media (min-width: 600px) { + padding-inline: 2rem; + } + @media (min-width: 900px) { + max-inline-size: calc(900px - 48px); + } + @media (min-width: 1200px) { + max-inline-size: calc(1200px - 48px); + } + @media (min-width: 1920px) { + max-inline-size: calc(1440px - 48px); + } + + .navbarContent { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.5rem; + } + } +} + +.inputBorder { + fieldset { + border-color: rgb(var(--mui-mainColorChannels-dark) / 0.22) !important; + } + label, + input { + color: rgb(var(--mui-mainColorChannels-dark) / 0.9) !important; + } +} + +.footerRadius { + border-start-start-radius: 3.75rem; + border-start-end-radius: 3.75rem; +} diff --git a/src/components/layout/horizontal/Footer.tsx b/src/components/layout/horizontal/Footer.tsx new file mode 100644 index 0000000..2b076f6 --- /dev/null +++ b/src/components/layout/horizontal/Footer.tsx @@ -0,0 +1,13 @@ +// Component Imports +import LayoutFooter from '@layouts/components/horizontal/Footer' +import FooterContent from './FooterContent' + +const Footer = () => { + return ( + + + + ) +} + +export default Footer diff --git a/src/components/layout/horizontal/FooterContent.tsx b/src/components/layout/horizontal/FooterContent.tsx new file mode 100644 index 0000000..74547ab --- /dev/null +++ b/src/components/layout/horizontal/FooterContent.tsx @@ -0,0 +1,55 @@ +'use client' + +// Next Imports +import Link from 'next/link' + +// Third-party Imports +import classnames from 'classnames' + +// Hook Imports +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +const FooterContent = () => { + // Hooks + const { isBreakpointReached } = useHorizontalNav() + + return ( +
+

+ {`© ${new Date().getFullYear()}, Made with `} + {`❤️`} + {` by `} + + Pixinvent + +

+ {!isBreakpointReached && ( +
+ + License + + + More Themes + + + Documentation + + + Support + +
+ )} +
+ ) +} + +export default FooterContent diff --git a/src/components/layout/horizontal/Header.tsx b/src/components/layout/horizontal/Header.tsx new file mode 100644 index 0000000..a12e042 --- /dev/null +++ b/src/components/layout/horizontal/Header.tsx @@ -0,0 +1,32 @@ +'use client' + +// Type Imports +import type { getDictionary } from '@/utils/getDictionary' + +// Component Imports +import Navigation from './Navigation' +import NavbarContent from './NavbarContent' +import Navbar from '@layouts/components/horizontal/Navbar' +import LayoutHeader from '@layouts/components/horizontal/Header' + +// Hook Imports +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +const Header = ({ dictionary }: { dictionary: Awaited> }) => { + // Hooks + const { isBreakpointReached } = useHorizontalNav() + + return ( + <> + + + + + {!isBreakpointReached && } + + {isBreakpointReached && } + + ) +} + +export default Header diff --git a/src/components/layout/horizontal/HorizontalMenu.tsx b/src/components/layout/horizontal/HorizontalMenu.tsx new file mode 100644 index 0000000..290a675 --- /dev/null +++ b/src/components/layout/horizontal/HorizontalMenu.tsx @@ -0,0 +1,443 @@ +// Next Imports +import { useParams } from 'next/navigation' + +// MUI Imports +import { useTheme } from '@mui/material/styles' + +// Type Imports +import type { getDictionary } from '@/utils/getDictionary' +import type { VerticalMenuContextProps } from '@menu/components/vertical-menu/Menu' + +// Component Imports +import HorizontalNav, { Menu, SubMenu, MenuItem } from '@menu/horizontal-menu' +import VerticalNavContent from './VerticalNavContent' +import CustomChip from '@core/components/mui/Chip' + +// import { GenerateHorizontalMenu } from '@components/GenerateMenu' + +// Hook Imports +import useVerticalNav from '@menu/hooks/useVerticalNav' + +// Styled Component Imports +import StyledHorizontalNavExpandIcon from '@menu/styles/horizontal/StyledHorizontalNavExpandIcon' +import StyledVerticalNavExpandIcon from '@menu/styles/vertical/StyledVerticalNavExpandIcon' + +// Style Imports +import menuItemStyles from '@core/styles/horizontal/menuItemStyles' +import menuRootStyles from '@core/styles/horizontal/menuRootStyles' +import verticalNavigationCustomStyles from '@core/styles/vertical/navigationCustomStyles' +import verticalMenuItemStyles from '@core/styles/vertical/menuItemStyles' +import verticalMenuSectionStyles from '@core/styles/vertical/menuSectionStyles' + +// Menu Data Imports +// import menuData from '@/data/navigation/horizontalMenuData' + +type RenderExpandIconProps = { + level?: number +} + +type RenderVerticalExpandIconProps = { + open?: boolean + transitionDuration?: VerticalMenuContextProps['transitionDuration'] +} + +const RenderExpandIcon = ({ level }: RenderExpandIconProps) => ( + + + +) + +const RenderVerticalExpandIcon = ({ open, transitionDuration }: RenderVerticalExpandIconProps) => ( + + + +) + +const HorizontalMenu = ({ dictionary }: { dictionary: Awaited> }) => { + // Hooks + const verticalNavOptions = useVerticalNav() + const theme = useTheme() + const params = useParams() + + // Vars + const { transitionDuration } = verticalNavOptions + const { lang: locale } = params + + return ( + + } + menuItemStyles={menuItemStyles(theme, 'tabler-circle')} + renderExpandedMenuItemIcon={{ icon: }} + popoutMenuOffset={{ + mainAxis: ({ level }) => (level && level > 0 ? 14 : 12), + alignmentAxis: 0 + }} + verticalMenuProps={{ + menuItemStyles: verticalMenuItemStyles(verticalNavOptions, theme), + renderExpandIcon: ({ open }) => ( + + ), + renderExpandedMenuItemIcon: { icon: }, + menuSectionStyles: verticalMenuSectionStyles(verticalNavOptions, theme) + }} + > + }> + }> + {dictionary['navigation'].crm} + + }> + {dictionary['navigation'].analytics} + + }> + {dictionary['navigation'].eCommerce} + + }> + {dictionary['navigation'].academy} + + }> + {dictionary['navigation'].logistics} + + + }> + }> + {dictionary['navigation'].dashboard} + + {dictionary['navigation'].list} + {dictionary['navigation'].add} + + {dictionary['navigation'].category} + + + + {dictionary['navigation'].list} + + {dictionary['navigation'].details} + + + + {dictionary['navigation'].list} + + {dictionary['navigation'].details} + + + + {dictionary['navigation'].manageReviews} + + {dictionary['navigation'].referrals} + {dictionary['navigation'].settings} + + }> + {dictionary['navigation'].dashboard} + {dictionary['navigation'].myCourses} + + {dictionary['navigation'].courseDetails} + + + }> + {dictionary['navigation'].dashboard} + {dictionary['navigation'].fleet} + + } + exactMatch={false} + activeUrl='/apps/email' + > + {dictionary['navigation'].email} + + }> + {dictionary['navigation'].chat} + + }> + {dictionary['navigation'].calendar} + + }> + {dictionary['navigation'].kanban} + + }> + {dictionary['navigation'].list} + + {dictionary['navigation'].preview} + + + {dictionary['navigation'].edit} + + {dictionary['navigation'].add} + + }> + {dictionary['navigation'].list} + {dictionary['navigation'].view} + + }> + {dictionary['navigation'].roles} + {dictionary['navigation'].permissions} + + + }> + }> + {dictionary['navigation'].userProfile} + + }> + {dictionary['navigation'].accountSettings} + + }> + {dictionary['navigation'].faq} + + }> + {dictionary['navigation'].pricing} + + }> + + {dictionary['navigation'].comingSoon} + + + {dictionary['navigation'].underMaintenance} + + + {dictionary['navigation'].pageNotFound404} + + + {dictionary['navigation'].notAuthorized401} + + + }> + + + {dictionary['navigation'].loginV1} + + + {dictionary['navigation'].loginV2} + + + + + {dictionary['navigation'].registerV1} + + + {dictionary['navigation'].registerV2} + + + {dictionary['navigation'].registerMultiSteps} + + + + + {dictionary['navigation'].verifyEmailV1} + + + {dictionary['navigation'].verifyEmailV2} + + + + + {dictionary['navigation'].forgotPasswordV1} + + + {dictionary['navigation'].forgotPasswordV2} + + + + + {dictionary['navigation'].resetPasswordV1} + + + {dictionary['navigation'].resetPasswordV2} + + + + + {dictionary['navigation'].twoStepsV1} + + + {dictionary['navigation'].twoStepsV2} + + + + }> + {dictionary['navigation'].checkout} + + {dictionary['navigation'].propertyListing} + + + {dictionary['navigation'].createDeal} + + + }> + {dictionary['navigation'].dialogExamples} + + }> + {dictionary['navigation'].basic} + {dictionary['navigation'].advanced} + + {dictionary['navigation'].statistics} + + {dictionary['navigation'].charts} + {dictionary['navigation'].actions} + + }> + + {dictionary['navigation'].landing} + + + {dictionary['navigation'].pricing} + + + {dictionary['navigation'].payment} + + + {dictionary['navigation'].checkout} + + + {dictionary['navigation'].helpCenter} + + + + }> + }> + {dictionary['navigation'].formLayouts} + + }> + {dictionary['navigation'].formValidation} + + }> + {dictionary['navigation'].formWizard} + + }> + {dictionary['navigation'].reactTable} + + } + href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/form-elements`} + suffix={} + target='_blank' + > + {dictionary['navigation'].formELements} + + } + href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/mui-table`} + suffix={} + target='_blank' + > + {dictionary['navigation'].muiTables} + + + }> + }> + {dictionary['navigation'].apex} + + }> + {dictionary['navigation'].recharts} + + + }> + } + href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/foundation`} + suffix={} + target='_blank' + > + {dictionary['navigation'].foundation} + + } + href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/user-interface/components`} + suffix={} + target='_blank' + > + {dictionary['navigation'].components} + + } + href={`${process.env.NEXT_PUBLIC_DOCS_URL}/docs/menu-examples/overview`} + suffix={} + target='_blank' + > + {dictionary['navigation'].menuExamples} + + } + target='_blank' + href='https://pixinvent.ticksy.com' + icon={} + > + {dictionary['navigation'].raiseSupport} + + } + target='_blank' + icon={} + href={`${process.env.NEXT_PUBLIC_DOCS_URL}`} + > + {dictionary['navigation'].documentation} + + } + icon={} + > + {dictionary['navigation'].itemWithBadge} + + } + href='https://pixinvent.com' + target='_blank' + suffix={} + > + {dictionary['navigation'].externalLink} + + }> + {dictionary['navigation'].menuLevel2} + + {dictionary['navigation'].menuLevel3} + {dictionary['navigation'].menuLevel3} + + + {dictionary['navigation'].disabledMenu} + + + {/* } + menuItemStyles={menuItemStyles(theme, 'tabler-circle')} + renderExpandedMenuItemIcon={{ icon: }} + popoutMenuOffset={{ + mainAxis: ({ level }) => (level && level > 0 ? 14 : 12), + alignmentAxis: 0 + }} + verticalMenuProps={{ + menuItemStyles: verticalMenuItemStyles(verticalNavOptions, theme), + renderExpandIcon: ({ open }) => ( + + ), + renderExpandedMenuItemIcon: { icon: }, + menuSectionStyles: verticalMenuSectionStyles(verticalNavOptions, theme) + }} + > + + */} + + ) +} + +export default HorizontalMenu diff --git a/src/components/layout/horizontal/NavToggle.tsx b/src/components/layout/horizontal/NavToggle.tsx new file mode 100644 index 0000000..0714553 --- /dev/null +++ b/src/components/layout/horizontal/NavToggle.tsx @@ -0,0 +1,24 @@ +// Hook Imports +import useVerticalNav from '@menu/hooks/useVerticalNav' +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +const NavToggle = () => { + // Hooks + const { toggleVerticalNav } = useVerticalNav() + const { isBreakpointReached } = useHorizontalNav() + + // Toggle Vertical Nav + const handleClick = () => { + toggleVerticalNav() + } + + return ( + <> + {/* */} + {/* Comment following code and uncomment this code in order to toggle menu on desktop screens as well */} + {isBreakpointReached && } + + ) +} + +export default NavToggle diff --git a/src/components/layout/horizontal/NavbarContent.tsx b/src/components/layout/horizontal/NavbarContent.tsx new file mode 100644 index 0000000..57dc8e7 --- /dev/null +++ b/src/components/layout/horizontal/NavbarContent.tsx @@ -0,0 +1,150 @@ +// Next Imports +import Link from 'next/link' +import { useParams } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Locale } from '@configs/i18n' +import type { ShortcutsType } from '@components/layout/shared/ShortcutsDropdown' +import type { NotificationsType } from '@components/layout/shared/NotificationsDropdown' + +// Component Imports +import NavToggle from './NavToggle' +import Logo from '@components/layout/shared/Logo' +import NavSearch from '@components/layout/shared/search' +import LanguageDropdown from '@components/layout/shared/LanguageDropdown' +import ModeDropdown from '@components/layout/shared/ModeDropdown' +import ShortcutsDropdown from '@components/layout/shared/ShortcutsDropdown' +import NotificationsDropdown from '@components/layout/shared/NotificationsDropdown' +import UserDropdown from '@components/layout/shared/UserDropdown' + +// Hook Imports +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' +import { getLocalizedUrl } from '@/utils/i18n' + +// Vars +const shortcuts: ShortcutsType[] = [ + { + url: '/apps/calendar', + icon: 'tabler-calendar', + title: 'Calendar', + subtitle: 'Appointments' + }, + { + url: '/apps/invoice/list', + icon: 'tabler-file-dollar', + title: 'Invoice App', + subtitle: 'Manage Accounts' + }, + { + url: '/apps/user/list', + icon: 'tabler-user', + title: 'Users', + subtitle: 'Manage Users' + }, + { + url: '/apps/roles', + icon: 'tabler-users-group', + title: 'Role Management', + subtitle: 'Permissions' + }, + { + url: '/', + icon: 'tabler-device-desktop-analytics', + title: 'Dashboard', + subtitle: 'User Dashboard' + }, + { + url: '/pages/account-settings', + icon: 'tabler-settings', + title: 'Settings', + subtitle: 'Account Settings' + } +] + +const notifications: NotificationsType[] = [ + { + avatarImage: '/images/avatars/8.png', + title: 'Congratulations Flora 🎉', + subtitle: 'Won the monthly bestseller gold badge', + time: '1h ago', + read: false + }, + { + title: 'Cecilia Becker', + avatarColor: 'secondary', + subtitle: 'Accepted your connection', + time: '12h ago', + read: false + }, + { + avatarImage: '/images/avatars/3.png', + title: 'Bernard Woods', + subtitle: 'You have new message from Bernard Woods', + time: 'May 18, 8:26 AM', + read: true + }, + { + avatarIcon: 'tabler-chart-bar', + title: 'Monthly report generated', + subtitle: 'July month financial report is generated', + avatarColor: 'info', + time: 'Apr 24, 10:30 AM', + read: true + }, + { + avatarText: 'MG', + title: 'Application has been approved 🚀', + subtitle: 'Your Meta Gadgets project application has been approved.', + avatarColor: 'success', + time: 'Feb 17, 12:17 PM', + read: true + }, + { + avatarIcon: 'tabler-mail', + title: 'New message from Harry', + subtitle: 'You have new message from Harry', + avatarColor: 'error', + time: 'Jan 6, 1:48 PM', + read: true + } +] + +const NavbarContent = () => { + // Hooks + const { isBreakpointReached } = useHorizontalNav() + const { lang: locale } = useParams() + + return ( +
+
+ + {/* Hide Logo on Smaller screens */} + {!isBreakpointReached && ( + + + + )} +
+ +
+ + + + + + + {/* Language Dropdown, Notification Dropdown, quick access menu dropdown, user dropdown will be placed here */} +
+
+ ) +} + +export default NavbarContent diff --git a/src/components/layout/horizontal/Navigation.tsx b/src/components/layout/horizontal/Navigation.tsx new file mode 100644 index 0000000..cbf6a85 --- /dev/null +++ b/src/components/layout/horizontal/Navigation.tsx @@ -0,0 +1,69 @@ +// Third-party Imports +import styled from '@emotion/styled' +import classnames from 'classnames' + +// Type Imports +import type { getDictionary } from '@/utils/getDictionary' + +// Component Imports +import HorizontalMenu from './HorizontalMenu' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +// Util Imports +import { horizontalLayoutClasses } from '@layouts/utils/layoutClasses' + +type StyledDivProps = { + isContentCompact: boolean + isBreakpointReached?: boolean +} + +const StyledDiv = styled.div` + ${({ isContentCompact, isBreakpointReached }) => + !isBreakpointReached && + ` + padding: ${themeConfig.layoutPadding}px; + + ${ + isContentCompact && + ` + margin-inline: auto; + max-inline-size: ${themeConfig.compactContentWidth}px; + ` + } + `} +` + +const Navigation = ({ dictionary }: { dictionary: Awaited> }) => { + // Hooks + const { settings } = useSettings() + const { isBreakpointReached } = useHorizontalNav() + + // Vars + const headerContentCompact = settings.navbarContentWidth === 'compact' + + return ( +
+ + + +
+ ) +} + +export default Navigation diff --git a/src/components/layout/horizontal/VerticalNavContent.tsx b/src/components/layout/horizontal/VerticalNavContent.tsx new file mode 100644 index 0000000..40efcfe --- /dev/null +++ b/src/components/layout/horizontal/VerticalNavContent.tsx @@ -0,0 +1,104 @@ +// React Imports +import { useRef } from 'react' + +// Next Imports +import Link from 'next/link' +import { useParams } from 'next/navigation' + +// MUI Imports +import { styled } from '@mui/material/styles' + +// Third-party Imports +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { ChildrenType } from '@core/types' +import type { Locale } from '@configs/i18n' + +// Component Imports +import NavHeader from '@menu/components/vertical-menu/NavHeader' +import Logo from '@components/layout/shared/Logo' +import NavCollapseIcons from '@menu/components/vertical-menu/NavCollapseIcons' + +// Hook Imports +import useHorizontalNav from '@menu/hooks/useHorizontalNav' + +// Util Imports +import { mapHorizontalToVerticalMenu } from '@menu/utils/menuUtils' +import { getLocalizedUrl } from '@/utils/i18n' + +const StyledBoxForShadow = styled('div')(({ theme }) => ({ + top: 60, + left: -8, + zIndex: 2, + opacity: 0, + position: 'absolute', + pointerEvents: 'none', + width: 'calc(100% + 15px)', + height: theme.mixins.toolbar.minHeight, + transition: 'opacity .15s ease-in-out', + background: `linear-gradient(var(--mui-palette-background-paper) ${ + theme.direction === 'rtl' ? '95%' : '5%' + }, rgb(var(--mui-palette-background-paperChannel) / 0.85) 30%, rgb(var(--mui-palette-background-paperChannel) / 0.5) 65%, rgb(var(--mui-palette-background-paperChannel) / 0.3) 75%, transparent)`, + '&.scrolled': { + opacity: 1 + } +})) + +const VerticalNavContent = ({ children }: ChildrenType) => { + // Hooks + const { isBreakpointReached } = useHorizontalNav() + const { lang: locale } = useParams() + + // Refs + const shadowRef = useRef(null) + + // Vars + const ScrollWrapper = isBreakpointReached ? 'div' : PerfectScrollbar + + const scrollMenu = (container: any, isPerfectScrollbar: boolean) => { + container = isBreakpointReached || !isPerfectScrollbar ? container.target : container + + if (shadowRef && container.scrollTop > 0) { + // @ts-ignore + if (!shadowRef.current.classList.contains('scrolled')) { + // @ts-ignore + shadowRef.current.classList.add('scrolled') + } + } else { + // @ts-ignore + shadowRef.current.classList.remove('scrolled') + } + } + + return ( + <> + + + + + } + unlockedIcon={} + closeIcon={} + /> + + + scrollMenu(container, false) + } + : { + options: { wheelPropagation: false, suppressScrollX: true }, + onScrollY: container => scrollMenu(container, true) + })} + > + {mapHorizontalToVerticalMenu(children)} + + + ) +} + +export default VerticalNavContent diff --git a/src/components/layout/shared/LanguageDropdown.tsx b/src/components/layout/shared/LanguageDropdown.tsx new file mode 100644 index 0000000..ac7f343 --- /dev/null +++ b/src/components/layout/shared/LanguageDropdown.tsx @@ -0,0 +1,117 @@ +'use client' + +// React Imports +import { useRef, useState } from 'react' + +// Next Imports +import Link from 'next/link' +import { usePathname, useParams } from 'next/navigation' + +// MUI Imports +import IconButton from '@mui/material/IconButton' +import Popper from '@mui/material/Popper' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import MenuList from '@mui/material/MenuList' +import MenuItem from '@mui/material/MenuItem' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +type LanguageDataType = { + langCode: Locale + langName: string +} + +const getLocalePath = (pathName: string, locale: string) => { + if (!pathName) return '/' + const segments = pathName.split('/') + + segments[1] = locale + + return segments.join('/') +} + +// Vars +const languageData: LanguageDataType[] = [ + { + langCode: 'en', + langName: 'English' + }, + { + langCode: 'fr', + langName: 'French' + }, + { + langCode: 'ar', + langName: 'Arabic' + } +] + +const LanguageDropdown = () => { + // States + const [open, setOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + + // Hooks + const pathName = usePathname() + const { settings } = useSettings() + const { lang } = useParams() + + const handleClose = () => { + setOpen(false) + } + + const handleToggle = () => { + setOpen(prevOpen => !prevOpen) + } + + return ( + <> + + + + + {({ TransitionProps, placement }) => ( + + + + + {languageData.map(locale => ( + + {locale.langName} + + ))} + + + + + )} + + + ) +} + +export default LanguageDropdown diff --git a/src/components/layout/shared/Loading.tsx b/src/components/layout/shared/Loading.tsx new file mode 100644 index 0000000..41b2770 --- /dev/null +++ b/src/components/layout/shared/Loading.tsx @@ -0,0 +1,9 @@ +import { CircularProgress } from '@mui/material' + +export default function Loading({ size = 60 }: { size?: number }) { + return ( +
+ +
+ ) +} diff --git a/src/components/layout/shared/Logo.tsx b/src/components/layout/shared/Logo.tsx new file mode 100644 index 0000000..c27cd9a --- /dev/null +++ b/src/components/layout/shared/Logo.tsx @@ -0,0 +1,89 @@ +'use client' + +// React Imports +import { useEffect, useRef } from 'react' +import type { CSSProperties } from 'react' + +// Third-party Imports +import styled from '@emotion/styled' + +// Type Imports +import type { VerticalNavContextProps } from '@menu/contexts/verticalNavContext' + +// Component Imports +import VuexyLogo from '@core/svg/Logo' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import useVerticalNav from '@menu/hooks/useVerticalNav' +import { useSettings } from '@core/hooks/useSettings' + +type LogoTextProps = { + isHovered?: VerticalNavContextProps['isHovered'] + isCollapsed?: VerticalNavContextProps['isCollapsed'] + transitionDuration?: VerticalNavContextProps['transitionDuration'] + isBreakpointReached?: VerticalNavContextProps['isBreakpointReached'] + color?: CSSProperties['color'] +} + +const LogoText = styled.span` + color: ${({ color }) => color ?? 'var(--mui-palette-text-primary)'}; + font-size: 1.375rem; + line-height: 1.09091; + font-weight: 700; + letter-spacing: 0.25px; + transition: ${({ transitionDuration }) => + `margin-inline-start ${transitionDuration}ms ease-in-out, opacity ${transitionDuration}ms ease-in-out`}; + + ${({ isHovered, isCollapsed, isBreakpointReached }) => + !isBreakpointReached && isCollapsed && !isHovered + ? 'opacity: 0; margin-inline-start: 0;' + : 'opacity: 1; margin-inline-start: 12px;'} +` + +const Logo = ({ color }: { color?: CSSProperties['color'] }) => { + // Refs + const logoTextRef = useRef(null) + + // Hooks + const { isHovered, transitionDuration, isBreakpointReached } = useVerticalNav() + const { settings } = useSettings() + + // Vars + const { layout } = settings + + useEffect(() => { + if (layout !== 'collapsed') { + return + } + + if (logoTextRef && logoTextRef.current) { + if (!isBreakpointReached && layout === 'collapsed' && !isHovered) { + logoTextRef.current?.classList.add('hidden') + } else { + logoTextRef.current.classList.remove('hidden') + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isHovered, layout, isBreakpointReached]) + + return ( +
+ + + {themeConfig.templateName} + +
+ ) +} + +export default Logo diff --git a/src/components/layout/shared/ModeDropdown.tsx b/src/components/layout/shared/ModeDropdown.tsx new file mode 100644 index 0000000..31e0b52 --- /dev/null +++ b/src/components/layout/shared/ModeDropdown.tsx @@ -0,0 +1,123 @@ +'use client' + +// React Imports +import { useRef, useState } from 'react' + +// MUI Imports +import Tooltip from '@mui/material/Tooltip' +import IconButton from '@mui/material/IconButton' +import Popper from '@mui/material/Popper' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import MenuList from '@mui/material/MenuList' +import MenuItem from '@mui/material/MenuItem' + +// Type Imports +import type { Mode } from '@core/types' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +const ModeDropdown = () => { + // States + const [open, setOpen] = useState(false) + const [tooltipOpen, setTooltipOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + + // Hooks + const { settings, updateSettings } = useSettings() + + const handleClose = () => { + setOpen(false) + setTooltipOpen(false) + } + + const handleToggle = () => { + setOpen(prevOpen => !prevOpen) + } + + const handleModeSwitch = (mode: Mode) => { + handleClose() + + if (settings.mode !== mode) { + updateSettings({ mode: mode }) + } + } + + const getModeIcon = () => { + if (settings.mode === 'system') { + return 'tabler-device-laptop' + } else if (settings.mode === 'dark') { + return 'tabler-moon-stars' + } else { + return 'tabler-sun' + } + } + + return ( + <> + setTooltipOpen(true)} + onClose={() => setTooltipOpen(false)} + open={open ? false : tooltipOpen ? true : false} + slotProps={{ popper: { className: 'capitalize' } }} + > + + + + + + {({ TransitionProps, placement }) => ( + + + + + handleModeSwitch('light')} + selected={settings.mode === 'light'} + > + + Light + + handleModeSwitch('dark')} + selected={settings.mode === 'dark'} + > + + Dark + + handleModeSwitch('system')} + selected={settings.mode === 'system'} + > + + System + + + + + + )} + + + ) +} + +export default ModeDropdown diff --git a/src/components/layout/shared/NotificationsDropdown.tsx b/src/components/layout/shared/NotificationsDropdown.tsx new file mode 100644 index 0000000..b616ded --- /dev/null +++ b/src/components/layout/shared/NotificationsDropdown.tsx @@ -0,0 +1,315 @@ +'use client' + +// React Imports +import { useRef, useState, useEffect } from 'react' +import type { MouseEvent, ReactNode } from 'react' + +// MUI Imports +import IconButton from '@mui/material/IconButton' +import Badge from '@mui/material/Badge' +import Popper from '@mui/material/Popper' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import Typography from '@mui/material/Typography' +import Chip from '@mui/material/Chip' +import Tooltip from '@mui/material/Tooltip' +import Divider from '@mui/material/Divider' +import Avatar from '@mui/material/Avatar' +import useMediaQuery from '@mui/material/useMediaQuery' +import Button from '@mui/material/Button' +import type { Theme } from '@mui/material/styles' + +// Third Party Components +import classnames from 'classnames' +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { ThemeColor } from '@core/types' +import type { CustomAvatarProps } from '@core/components/mui/Avatar' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { getInitials } from '@/utils/getInitials' + +export type NotificationsType = { + title: string + subtitle: string + time: string + read: boolean +} & ( + | { + avatarImage?: string + avatarIcon?: never + avatarText?: never + avatarColor?: never + avatarSkin?: never + } + | { + avatarIcon?: string + avatarColor?: ThemeColor + avatarSkin?: CustomAvatarProps['skin'] + avatarImage?: never + avatarText?: never + } + | { + avatarText?: string + avatarColor?: ThemeColor + avatarSkin?: CustomAvatarProps['skin'] + avatarImage?: never + avatarIcon?: never + } +) + +const ScrollWrapper = ({ children, hidden }: { children: ReactNode; hidden: boolean }) => { + if (hidden) { + return
{children}
+ } else { + return ( + + {children} + + ) + } +} + +const getAvatar = ( + params: Pick +) => { + const { avatarImage, avatarIcon, avatarText, title, avatarColor, avatarSkin } = params + + if (avatarImage) { + return + } else if (avatarIcon) { + return ( + + + + ) + } else { + return ( + + {avatarText || getInitials(title)} + + ) + } +} + +const NotificationDropdown = ({ notifications }: { notifications: NotificationsType[] }) => { + // States + const [open, setOpen] = useState(false) + const [notificationsState, setNotificationsState] = useState(notifications) + + // Vars + const notificationCount = notificationsState.filter(notification => !notification.read).length + const readAll = notificationsState.every(notification => notification.read) + + // Refs + const anchorRef = useRef(null) + const ref = useRef(null) + + // Hooks + const hidden = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg')) + const isSmallScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm')) + const { settings } = useSettings() + + const handleClose = () => { + setOpen(false) + } + + const handleToggle = () => { + setOpen(prevOpen => !prevOpen) + } + + // Read notification when notification is clicked + const handleReadNotification = (event: MouseEvent, value: boolean, index: number) => { + event.stopPropagation() + const newNotifications = [...notificationsState] + + newNotifications[index].read = value + setNotificationsState(newNotifications) + } + + // Remove notification when close icon is clicked + const handleRemoveNotification = (event: MouseEvent, index: number) => { + event.stopPropagation() + const newNotifications = [...notificationsState] + + newNotifications.splice(index, 1) + setNotificationsState(newNotifications) + } + + // Read or unread all notifications when read all icon is clicked + const readAllNotifications = () => { + const newNotifications = [...notificationsState] + + newNotifications.forEach(notification => { + notification.read = !readAll + }) + setNotificationsState(newNotifications) + } + + useEffect(() => { + const adjustPopoverHeight = () => { + if (ref.current) { + // Calculate available height, subtracting any fixed UI elements' height as necessary + const availableHeight = window.innerHeight - 100 + + ref.current.style.height = `${Math.min(availableHeight, 550)}px` + } + } + + window.addEventListener('resize', adjustPopoverHeight) + }, []) + + return ( + <> + + + + + + + {({ TransitionProps, placement }) => ( + + + +
+
+ + Notifications + + {notificationCount > 0 && ( + + )} + + {notificationsState.length > 0 ? ( + readAllNotifications()} className='text-textPrimary'> + + + ) : ( + <> + )} + +
+ + + +
+ +
+
+
+
+
+ )} +
+ + ) +} + +export default NotificationDropdown diff --git a/src/components/layout/shared/ShortcutsDropdown.tsx b/src/components/layout/shared/ShortcutsDropdown.tsx new file mode 100644 index 0000000..cba6cfe --- /dev/null +++ b/src/components/layout/shared/ShortcutsDropdown.tsx @@ -0,0 +1,189 @@ +'use client' + +// React Imports +import { useCallback, useRef, useState, useEffect } from 'react' +import type { ReactNode } from 'react' + +// Next Imports +import Link from 'next/link' +import { useParams } from 'next/navigation' + +// MUI Imports +import IconButton from '@mui/material/IconButton' +import Popper from '@mui/material/Popper' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import Typography from '@mui/material/Typography' +import Tooltip from '@mui/material/Tooltip' +import Divider from '@mui/material/Divider' +import Grid from '@mui/material/Grid2' +import useMediaQuery from '@mui/material/useMediaQuery' +import type { Theme } from '@mui/material/styles' + +// Third Party Components +import classnames from 'classnames' +import PerfectScrollbar from 'react-perfect-scrollbar' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Component Imports +import CustomAvatar from '@core/components/mui/Avatar' + +// Config Imports +import themeConfig from '@configs/themeConfig' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +export type ShortcutsType = { + url: string + icon: string + title: string + subtitle: string +} + +const ScrollWrapper = ({ children, hidden }: { children: ReactNode; hidden: boolean }) => { + if (hidden) { + return
{children}
+ } else { + return ( + + {children} + + ) + } +} + +const ShortcutsDropdown = ({ shortcuts }: { shortcuts: ShortcutsType[] }) => { + // States + const [open, setOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + const ref = useRef(null) + + // Hooks + const hidden = useMediaQuery((theme: Theme) => theme.breakpoints.down('lg')) + const isSmallScreen = useMediaQuery((theme: Theme) => theme.breakpoints.down('sm')) + const { settings } = useSettings() + const { lang: locale } = useParams() + + const handleClose = useCallback(() => { + setOpen(false) + }, []) + + const handleToggle = useCallback(() => { + setOpen(prevOpen => !prevOpen) + }, []) + + useEffect(() => { + const adjustPopoverHeight = () => { + if (ref.current) { + // Calculate available height, subtracting any fixed UI elements' height as necessary + const availableHeight = window.innerHeight - 100 + + ref.current.style.height = `${Math.min(availableHeight, 550)}px` + } + } + + window.addEventListener('resize', adjustPopoverHeight) + }, []) + + return ( + <> + + + + + {({ TransitionProps, placement }) => ( + + + +
+
+ + Shortcuts + + + + + + +
+ + +
+
+
+
+ )} +
+ + ) +} + +export default ShortcutsDropdown diff --git a/src/components/layout/shared/UserDropdown.tsx b/src/components/layout/shared/UserDropdown.tsx new file mode 100644 index 0000000..1542af7 --- /dev/null +++ b/src/components/layout/shared/UserDropdown.tsx @@ -0,0 +1,172 @@ +'use client' + +// React Imports +import { useRef, useState } from 'react' +import type { MouseEvent } from 'react' + +// Next Imports +import { useParams, useRouter } from 'next/navigation' + +// MUI Imports +import { styled } from '@mui/material/styles' +import Badge from '@mui/material/Badge' +import Avatar from '@mui/material/Avatar' +import Popper from '@mui/material/Popper' +import Fade from '@mui/material/Fade' +import Paper from '@mui/material/Paper' +import ClickAwayListener from '@mui/material/ClickAwayListener' +import MenuList from '@mui/material/MenuList' +import Typography from '@mui/material/Typography' +import Divider from '@mui/material/Divider' +import MenuItem from '@mui/material/MenuItem' +import Button from '@mui/material/Button' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Hook Imports +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' +import { useAuthMutation } from '../../../services/mutations/auth' + +// Styled component for badge content +const BadgeContentSpan = styled('span')({ + width: 8, + height: 8, + borderRadius: '50%', + cursor: 'pointer', + backgroundColor: 'var(--mui-palette-success-main)', + boxShadow: '0 0 0 2px var(--mui-palette-background-paper)' +}) + +const UserDropdown = () => { + // States + const [open, setOpen] = useState(false) + + // Refs + const anchorRef = useRef(null) + + const { mutate } = useAuthMutation.logout() + + // Hooks + const router = useRouter() + const { settings } = useSettings() + const { lang: locale } = useParams() + + const handleDropdownOpen = () => { + !open ? setOpen(true) : setOpen(false) + } + + const handleDropdownClose = (event?: MouseEvent | (MouseEvent | TouchEvent), url?: string) => { + if (url) { + router.push(getLocalizedUrl(url, locale as Locale)) + } + + if (anchorRef.current && anchorRef.current.contains(event?.target as HTMLElement)) { + return + } + + setOpen(false) + } + + const handleUserLogout = async () => { + try { + // Sign out from the app + // await signOut({ callbackUrl: process.env.NEXT_PUBLIC_APP_URL }) + mutate() + router.push(getLocalizedUrl('/login', locale as Locale)) + } catch (error) { + console.error(error) + + // Show above error in a toast like following + // toastService.error((err as Error).message) + } + } + + return ( + <> + } + anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }} + className='mis-2' + > + + + + {({ TransitionProps, placement }) => ( + + + handleDropdownClose(e as MouseEvent | TouchEvent)}> + +
+ +
+ + {'john doe'} + + {'email'} +
+
+ + handleDropdownClose(e, '/pages/user-profile')}> + + My Profile + + handleDropdownClose(e, '/pages/account-settings')}> + + Settings + + handleDropdownClose(e, '/pages/pricing')}> + + Pricing + + handleDropdownClose(e, '/pages/faq')}> + + FAQ + +
+ +
+
+
+
+
+ )} +
+ + ) +} + +export default UserDropdown diff --git a/src/components/layout/shared/search/DefaultSuggestions.tsx b/src/components/layout/shared/search/DefaultSuggestions.tsx new file mode 100644 index 0000000..db6d2f5 --- /dev/null +++ b/src/components/layout/shared/search/DefaultSuggestions.tsx @@ -0,0 +1,160 @@ +// Next Imports +import Link from 'next/link' +import { useParams } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +type DefaultSuggestionsType = { + sectionLabel: string + items: { + label: string + href: string + icon?: string + }[] +} + +const defaultSuggestions: DefaultSuggestionsType[] = [ + { + sectionLabel: 'Popular Searches', + items: [ + { + label: 'Analytics', + href: '/dashboards/analytics', + icon: 'tabler-trending-up' + }, + { + label: 'CRM', + href: '/dashboards/crm', + icon: 'tabler-chart-pie-2' + }, + { + label: 'eCommerce', + href: '/dashboards/ecommerce', + icon: 'tabler-shopping-cart' + }, + { + label: 'User List', + href: '/apps/user/list', + icon: 'tabler-file-description' + } + ] + }, + { + sectionLabel: 'Apps', + items: [ + { + label: 'Calendar', + href: '/apps/calendar', + icon: 'tabler-calendar' + }, + { + label: 'Invoice List', + href: '/apps/invoice/list', + icon: 'tabler-file-info' + }, + { + label: 'User List', + href: '/apps/user/list', + icon: 'tabler-file-invoice' + }, + { + label: 'Roles & Permissions', + href: '/apps/roles', + icon: 'tabler-lock' + } + ] + }, + { + sectionLabel: 'Pages', + items: [ + { + label: 'User Profile', + href: '/pages/user-profile', + icon: 'tabler-user' + }, + { + label: 'Account Settings', + href: '/pages/account-settings', + icon: 'tabler-settings' + }, + { + label: 'Pricing', + href: '/pages/pricing', + icon: 'tabler-currency-dollar' + }, + { + label: 'FAQ', + href: '/pages/faq', + icon: 'tabler-help-circle' + } + ] + }, + { + sectionLabel: 'Forms & Charts', + items: [ + { + label: 'Form Layouts', + href: '/forms/form-layouts', + icon: 'tabler-layout' + }, + { + label: 'Form Validation', + href: '/forms/form-validation', + icon: 'tabler-checkup-list' + }, + { + label: 'Form Wizard', + href: '/forms/form-wizard', + icon: 'tabler-git-merge' + }, + { + label: 'Apex Charts', + href: '/charts/apex-charts', + icon: 'tabler-chart-ppf' + } + ] + } +] + +const DefaultSuggestions = ({ setOpen }: { setOpen: (value: boolean) => void }) => { + // Hooks + const { lang: locale } = useParams() + + return ( +
+ {defaultSuggestions.map((section, index) => ( +
+

+ {section.sectionLabel} +

+
    + {section.items.map((item, i) => ( +
  • + setOpen(false)} + > + {item.icon && } +

    {item.label}

    + +
  • + ))} +
+
+ ))} +
+ ) +} + +export default DefaultSuggestions diff --git a/src/components/layout/shared/search/NoResult.tsx b/src/components/layout/shared/search/NoResult.tsx new file mode 100644 index 0000000..0231906 --- /dev/null +++ b/src/components/layout/shared/search/NoResult.tsx @@ -0,0 +1,67 @@ +// Next Imports +import Link from 'next/link' +import { useParams } from 'next/navigation' + +// Third-party Imports +import classnames from 'classnames' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +type NoResultData = { + label: string + href: string + icon: string +} + +const noResultData: NoResultData[] = [ + { + label: 'Analytics', + href: '/dashboards/analytics', + icon: 'tabler-chart-pie-2' + }, + { + label: 'User Profile', + href: '/pages/user-profile', + icon: 'tabler-user' + }, + { + label: 'CRM', + href: '/dashboards/crm', + icon: 'tabler-chart-donut-3' + } +] + +const NoResult = ({ searchValue, setOpen }: { searchValue: string; setOpen: (value: boolean) => void }) => { + // Hooks + const { lang: locale } = useParams() + + return ( +
+
+ +

{`No result for "${searchValue}"`}

+

Try searching for

+
    + {noResultData.map((item, index) => ( +
  • + setOpen(false)} + > + +

    {item.label}

    + +
  • + ))} +
+
+
+ ) +} + +export default NoResult diff --git a/src/components/layout/shared/search/index.tsx b/src/components/layout/shared/search/index.tsx new file mode 100644 index 0000000..2d67e32 --- /dev/null +++ b/src/components/layout/shared/search/index.tsx @@ -0,0 +1,273 @@ +'use client' + +// React Imports +import { useEffect, useState } from 'react' +import type { ReactNode } from 'react' + +// Next Imports +import { useParams, useRouter, usePathname } from 'next/navigation' + +// MUI Imports +import IconButton from '@mui/material/IconButton' + +// Third-party Imports +import classnames from 'classnames' +import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from 'cmdk' +import { Title, Description } from '@radix-ui/react-dialog' + +// Type Imports +import type { Locale } from '@configs/i18n' + +// Component Imports +import DefaultSuggestions from './DefaultSuggestions' +import NoResult from './NoResult' + +// Hook Imports +import useVerticalNav from '@menu/hooks/useVerticalNav' +import { useSettings } from '@core/hooks/useSettings' + +// Util Imports +import { getLocalizedUrl } from '@/utils/i18n' + +// Style Imports +import './styles.css' + +// Data Imports +import data from '@/data/searchData' + +type Item = { + id: string + name: string + url: string + excludeLang?: boolean + icon: string + shortcut?: string +} + +type Section = { + title: string + items: Item[] +} + +type SearchItemProps = { + children: ReactNode + shortcut?: string + value: string + url: string + currentPath: string + onSelect?: () => void +} + +// Transform the data to group items by their sections +const transformedData = data.reduce((acc: Section[], item) => { + const existingSection = acc.find(section => section.title === item.section) + + const newItem = { + id: item.id, + name: item.name, + url: item.url, + excludeLang: item.excludeLang, + icon: item.icon, + shortcut: item.shortcut + } + + if (existingSection) { + existingSection.items.push(newItem) + } else { + acc.push({ title: item.section, items: [newItem] }) + } + + return acc +}, []) + +// SearchItem Component for introduce the shortcut keys +const SearchItem = ({ children, shortcut, value, currentPath, url, onSelect = () => {} }: SearchItemProps) => { + return ( + + {children} + {shortcut && ( +
+ {shortcut.split(' ').map(key => { + return {key} + })} +
+ )} +
+ ) +} + +// Helper function to filter and limit results per section based on the number of sections +const getFilteredResults = (sections: Section[]) => { + const limit = sections.length > 1 ? 3 : 5 + + return sections.map(section => ({ + ...section, + items: section.items.slice(0, limit) + })) +} + +// Footer component for the search menu +const CommandFooter = () => { + return ( +
+
+ + + + + + + to navigate +
+
+ + + + to open +
+
+ esc + to close +
+
+ ) +} + +const NavSearch = () => { + // States + const [open, setOpen] = useState(false) + const [searchValue, setSearchValue] = useState('') + + // Hooks + const router = useRouter() + const pathName = usePathname() + const { settings } = useSettings() + const { lang: locale } = useParams() + const { isBreakpointReached } = useVerticalNav() + + // When an item is selected from the search results + const onSearchItemSelect = (item: Item) => { + item.url.startsWith('http') + ? window.open(item.url, '_blank') + : router.push(item.excludeLang ? item.url : getLocalizedUrl(item.url, locale as Locale)) + setOpen(false) + } + + // Filter the data based on the search query + const filteredData = (sections: Section[], query: string) => { + const searchQuery = query.trim().toLowerCase() + + return sections + .filter(section => { + const sectionMatches = section.title.toLowerCase().includes(searchQuery) + + const itemsMatch = section.items.some( + item => + item.name.toLowerCase().includes(searchQuery) || + (item.shortcut && item.shortcut.toLowerCase().includes(searchQuery)) + ) + + return sectionMatches || itemsMatch + }) + .map(section => ({ + ...section, + items: section.items.filter( + item => + section.title.toLowerCase().includes(searchQuery) || + item.name.toLowerCase().includes(searchQuery) || + (item.shortcut && item.shortcut.toLowerCase().includes(searchQuery)) + ) + })) + } + + const limitedData = getFilteredResults(filteredData(transformedData, searchValue)) + + // Toggle the menu when ⌘K is pressed + useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { + e.preventDefault() + setOpen(open => !open) + } + } + + document.addEventListener('keydown', down) + + return () => document.removeEventListener('keydown', down) + }, []) + + // Reset the search value when the menu is closed + useEffect(() => { + if (!open && searchValue !== '') { + setSearchValue('') + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]) + + return ( + <> + {isBreakpointReached || settings.layout === 'horizontal' ? ( + setOpen(true)}> + + + ) : ( +
setOpen(true)}> + setOpen(true)}> + + +
Search ⌘K
+
+ )} + +
+