diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..34d65be --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +# Build directories +build/* +dist/* +public/* +**/out/* +**/.next/* +**/node_modules/* + +yarn.lock +package-lock.json +jsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3e97f62 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,106 @@ +### v3.0.0 + +###### Apr 3, 2025 + +- Support MUI v7. +- Support React v19. +- Support Eslint v9. +- Upgrade and restructure the directory. +- Upgrade some dependencies to the latest versions. + +--- + +### v2.0.0 + +###### Aug 24, 2024 + +- [New] Migrate to typescript. +- Upgrade and restructure the directory. +- Upgrade some dependencies to the latest versions. + +--- + +### v1.8.0 + +###### Wed 11, 2023 + +- [New] Migrate to vite.js. +- Upgrade and restructure the directory. +- Upgrade some dependencies to the latest versions + +--- + +### v1.7.0 + +###### Feb 21, 2023 + +- Upgrade some dependencies to the latest versions + +--- + +### v1.6.0 + +###### Oct 17, 2022 + +- Upgrade and restructure the directory. +- Upgrade some dependencies to the latest versions + +--- + +### v1.5.0 + +###### Jul 04, 2022 + +- Support react 18. +- Upgrade some dependencies to the latest versions + +--- + +### v1.4.0 + +###### Apr 12, 2022 + +- Update `src/components`. +- Update `src/sections`. +- Update `src/pages`. +- Update `src/layouts`. +- Update `src/theme`. +- Upgrade some dependencies to the latest versions + +--- + +### v1.3.0 + +###### Feb 21, 2022 + +- Support react-script v5.0.0 +- Source code improvement +- Upgrade some dependencies to the latest versions + +--- + +### v1.2.0 + +###### Sep 18, 2021 + +- Support MIU v5.0.0 official release +- Upgrade some dependencies to the latest versions +- Update `src/theme/typography.js` +- Upgrade some dependencies to the latest versions + +--- + +### v1.1.0 + +###### Jul 23, 2021 + +- Support MUI v5.0.0-beta.1 +- Upgrade some dependencies to the latest versions + +--- + +### v1.0.0 + +###### Jun 28, 2021 + +Initial release. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..fe7c17e --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,194 @@ +import globals from 'globals'; +import eslintJs from '@eslint/js'; +import eslintTs from 'typescript-eslint'; +import reactPlugin from 'eslint-plugin-react'; +import importPlugin from 'eslint-plugin-import'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import perfectionistPlugin from 'eslint-plugin-perfectionist'; +import unusedImportsPlugin from 'eslint-plugin-unused-imports'; + +// ---------------------------------------------------------------------- + +/** + * @rules common + * from 'react', 'eslint-plugin-react-hooks'... + */ +const commonRules = () => ({ + ...reactHooksPlugin.configs.recommended.rules, + 'func-names': 1, + 'no-bitwise': 2, + 'no-unused-vars': 0, + 'object-shorthand': 1, + 'no-useless-rename': 1, + 'default-case-last': 2, + 'consistent-return': 2, + 'no-constant-condition': 1, + 'default-case': [2, { commentPattern: '^no default$' }], + 'lines-around-directive': [2, { before: 'always', after: 'always' }], + 'arrow-body-style': [2, 'as-needed', { requireReturnForObjectLiteral: false }], + // react + 'react/jsx-key': 0, + 'react/prop-types': 0, + 'react/display-name': 0, + 'react/no-children-prop': 0, + 'react/jsx-boolean-value': 2, + 'react/self-closing-comp': 2, + 'react/react-in-jsx-scope': 0, + 'react/jsx-no-useless-fragment': [1, { allowExpressions: true }], + 'react/jsx-curly-brace-presence': [2, { props: 'never', children: 'never' }], + // typescript + '@typescript-eslint/no-shadow': 2, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/no-empty-object-type': 0, + '@typescript-eslint/consistent-type-imports': 1, + '@typescript-eslint/no-unused-vars': [1, { args: 'none' }], +}); + +/** + * @rules import + * from 'eslint-plugin-import'. + */ +const importRules = () => ({ + ...importPlugin.configs.recommended.rules, + 'import/named': 0, + 'import/export': 0, + 'import/default': 0, + 'import/namespace': 0, + 'import/no-named-as-default': 0, + 'import/newline-after-import': 2, + 'import/no-named-as-default-member': 0, + 'import/no-cycle': [ + 0, // disabled if slow + { maxDepth: '∞', ignoreExternal: false, allowUnsafeDynamicCyclicDependency: false }, + ], +}); + +/** + * @rules unused imports + * from 'eslint-plugin-unused-imports'. + */ +const unusedImportsRules = () => ({ + 'unused-imports/no-unused-imports': 1, + 'unused-imports/no-unused-vars': [ + 0, + { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' }, + ], +}); + +/** + * @rules sort or imports/exports + * from 'eslint-plugin-perfectionist'. + */ +const sortImportsRules = () => { + const customGroups = { + mui: ['custom-mui'], + auth: ['custom-auth'], + hooks: ['custom-hooks'], + utils: ['custom-utils'], + types: ['custom-types'], + routes: ['custom-routes'], + sections: ['custom-sections'], + components: ['custom-components'], + }; + + return { + 'perfectionist/sort-named-imports': [1, { type: 'line-length', order: 'asc' }], + 'perfectionist/sort-named-exports': [1, { type: 'line-length', order: 'asc' }], + 'perfectionist/sort-exports': [ + 1, + { + order: 'asc', + type: 'line-length', + groupKind: 'values-first', + }, + ], + 'perfectionist/sort-imports': [ + 2, + { + order: 'asc', + ignoreCase: true, + type: 'line-length', + environment: 'node', + maxLineLength: undefined, + newlinesBetween: 'always', + internalPattern: ['^src/.+'], + groups: [ + 'style', + 'side-effect', + 'type', + ['builtin', 'external'], + customGroups.mui, + customGroups.routes, + customGroups.hooks, + customGroups.utils, + 'internal', + customGroups.components, + customGroups.sections, + customGroups.auth, + customGroups.types, + ['parent', 'sibling', 'index'], + ['parent-type', 'sibling-type', 'index-type'], + 'object', + 'unknown', + ], + customGroups: { + value: { + [customGroups.mui]: ['^@mui/.+'], + [customGroups.auth]: ['^src/auth/.+'], + [customGroups.hooks]: ['^src/hooks/.+'], + [customGroups.utils]: ['^src/utils/.+'], + [customGroups.types]: ['^src/types/.+'], + [customGroups.routes]: ['^src/routes/.+'], + [customGroups.sections]: ['^src/sections/.+'], + [customGroups.components]: ['^src/components/.+'], + }, + }, + }, + ], + }; +}; + +/** + * Custom ESLint configuration. + */ +export const customConfig = { + plugins: { + 'react-hooks': reactHooksPlugin, + 'unused-imports': unusedImportsPlugin, + perfectionist: perfectionistPlugin, + import: importPlugin, + }, + settings: { + // https://www.npmjs.com/package/eslint-import-resolver-typescript + ...importPlugin.configs.typescript.settings, + 'import/resolver': { + ...importPlugin.configs.typescript.settings['import/resolver'], + typescript: { + project: './tsconfig.json', + }, + }, + }, + rules: { + ...commonRules(), + ...importRules(), + ...unusedImportsRules(), + ...sortImportsRules(), + }, +}; + +// ---------------------------------------------------------------------- + +export default [ + { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] }, + { ignores: ['*', '!src/', '!eslint.config.*'] }, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node }, + }, + settings: { react: { version: 'detect' } }, + }, + eslintJs.configs.recommended, + ...eslintTs.configs.recommended, + reactPlugin.configs.flat.recommended, + customConfig, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000..efb687c --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + + Minimal UI Kit + + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..88c6fd9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6851 @@ +{ + "name": "@minimal/material-kit-react", + "version": "3.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@minimal/material-kit-react", + "version": "3.0.0", + "dependencies": { + "@emotion/cache": "^11.14.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@fontsource-variable/dm-sans": "^5.2.5", + "@fontsource/barlow": "^5.2.5", + "@iconify/react": "^5.2.1", + "@mui/lab": "^7.0.0-beta.10", + "@mui/material": "^7.0.1", + "apexcharts": "^4.5.0", + "dayjs": "^1.11.13", + "es-toolkit": "^1.34.1", + "minimal-shared": "^1.0.7", + "react": "^19.1.0", + "react-apexcharts": "^1.7.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.4.1", + "simplebar-react": "^3.3.0" + }, + "devDependencies": { + "@eslint/js": "^9.23.0", + "@types/node": "^22.14.0", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.1", + "@typescript-eslint/parser": "^8.29.0", + "@vitejs/plugin-react-swc": "^3.8.1", + "eslint": "^9.23.0", + "eslint-import-resolver-typescript": "^4.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-perfectionist": "^4.11.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^16.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.2", + "typescript-eslint": "^8.29.0", + "vite": "^6.2.5", + "vite-plugin-checker": "^0.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.0.tgz", + "integrity": "sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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/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/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.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "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/eslint-utils/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-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/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/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/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "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": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fontsource-variable/dm-sans": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource-variable/dm-sans/-/dm-sans-5.2.5.tgz", + "integrity": "sha512-ynWdb1Ncn5ywUOE6OkTsvgjkiZKj+xM/GS2iVE47MBvS3AlfOSyOy3xynfkQsM3ngaxdCamT/06hZGAgPmao0A==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/barlow": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/barlow/-/barlow-5.2.5.tgz", + "integrity": "sha512-p+2XXEM7v85kbn0Dh8g0YLMjTCDiRCAi9nHik6w/2owZ9CkT1yYGGgaUMshJRqykh7efv1gE0QxAkOhZHd8tEg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/react": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.1.tgz", + "integrity": "sha512-37GDR3fYDZmnmUn9RagyaX+zca24jfVOMY8E1IXTqJuE8pxNtN51KWPQe3VODOWvuUurq7q9uUu3CFrpqj5Iqg==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.1.tgz", + "integrity": "sha512-T5DNVnSD9pMbj4Jk/Uphz+yvj9dfpl2+EqsOuJtG12HxEihNG5pd3qzX5yM1Id4dDwKRvM3dPVcxyzavTFhJeA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/lab": { + "version": "7.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-7.0.0-beta.10.tgz", + "integrity": "sha512-ide9oABYRAvJAFtxjc+bAaeAR74yVZ4avV7Ffj/D5CbbgSp/d5ns9SQtuWIZ7oJ3S7l1fcR06dj8EZuPRTmo8A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/system": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.1", + "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": "^7.0.1", + "@mui/material-pigment-css": "^7.0.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": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.1.tgz", + "integrity": "sha512-tQwjIIsn/UUSCHoCIQVkANuLua67h7Ro9M9gIHoGWaFbJFuF6cSO4Oda2olDVqIs4SWG+PaDChuu6SngxsaoyQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/core-downloads-tracker": "^7.0.1", + "@mui/system": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.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": "^7.0.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/private-theming": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz", + "integrity": "sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/utils": "^7.0.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" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz", + "integrity": "sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@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": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz", + "integrity": "sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/private-theming": "^7.0.1", + "@mui/styled-engine": "^7.0.1", + "@mui/types": "^7.4.0", + "@mui/utils": "^7.0.1", + "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/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz", + "integrity": "sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz", + "integrity": "sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "@mui/types": "^7.4.0", + "@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/@napi-rs/wasm-runtime": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz", + "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "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/@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/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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/@svgdotjs/svg.draggable.js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", + "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", + "license": "MIT", + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", + "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz", + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz", + "integrity": "sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@swc/core": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.16.tgz", + "integrity": "sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.21" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.11.16", + "@swc/core-darwin-x64": "1.11.16", + "@swc/core-linux-arm-gnueabihf": "1.11.16", + "@swc/core-linux-arm64-gnu": "1.11.16", + "@swc/core-linux-arm64-musl": "1.11.16", + "@swc/core-linux-x64-gnu": "1.11.16", + "@swc/core-linux-x64-musl": "1.11.16", + "@swc/core-win32-arm64-msvc": "1.11.16", + "@swc/core-win32-ia32-msvc": "1.11.16", + "@swc/core-win32-x64-msvc": "1.11.16" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.16.tgz", + "integrity": "sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.16.tgz", + "integrity": "sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.16.tgz", + "integrity": "sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.16.tgz", + "integrity": "sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.16.tgz", + "integrity": "sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.16.tgz", + "integrity": "sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.16.tgz", + "integrity": "sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.16.tgz", + "integrity": "sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.16.tgz", + "integrity": "sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.16", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.16.tgz", + "integrity": "sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", + "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "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/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "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/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.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/@typescript-eslint/eslint-plugin": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", + "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/type-utils": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", + "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", + "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", + "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", + "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", + "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", + "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.3.3.tgz", + "integrity": "sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.3.3.tgz", + "integrity": "sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.3.3.tgz", + "integrity": "sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.3.3.tgz", + "integrity": "sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.3.3.tgz", + "integrity": "sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.3.3.tgz", + "integrity": "sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.3.3.tgz", + "integrity": "sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.3.3.tgz", + "integrity": "sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.3.3.tgz", + "integrity": "sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.3.3.tgz", + "integrity": "sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.3.3.tgz", + "integrity": "sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.3.3.tgz", + "integrity": "sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.3.3.tgz", + "integrity": "sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.3.tgz", + "integrity": "sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.8.1.tgz", + "integrity": "sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/core": "^1.11.11" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6" + } + }, + "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.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "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": "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/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/apexcharts": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.5.0.tgz", + "integrity": "sha512-E7ZkrVqPNBUWy/Rmg8DEIqHNBmElzICE/oxOX5Ekvs2ICQUOK/VkEkMH09JGJu+O/EA0NL31hxlmF+wrwrSLaQ==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.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.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "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", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "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/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==", + "dev": true, + "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/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/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "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/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/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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/cosmiconfig/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/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/cross-spawn/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/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/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/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "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/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/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/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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/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/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "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.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.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "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-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", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.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" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/es-toolkit": { + "version": "1.34.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.34.1.tgz", + "integrity": "sha512-OA6cd94fJV9bm8dWhIySkWq4xV+rAQnBZUr2dnpXam0QJ8c+hurLbKA8/QooL9Mx4WCAxvIDsiEkid5KPQ5xgQ==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "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": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "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": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.1.tgz", + "integrity": "sha512-/dR9YMomeBlvfuvX5q0C3Y/2PHC9OCRdT2ijFwdfq/4Bq+4m5/lqstEp9k3P6ocha1pCbhoY9fkwVYLmOqR0VQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.12", + "unrs-resolver": "^1.3.3" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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/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-perfectionist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.11.0.tgz", + "integrity": "sha512-5s+ehXydnLPQpLDj5mJ0CnYj2fQe6v6gKA3tS+FZVBLzwMOh8skH+l+1Gni08rG0SdEcNhJyjQp/mEkDYK8czw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.29.0", + "@typescript-eslint/utils": "^8.29.0", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": ">=8.45.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "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.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" + }, + "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.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "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/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/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/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "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/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/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/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "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-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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/globals": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/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/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/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/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-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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "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-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-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-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-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/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/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/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/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/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/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/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/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/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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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/micromatch/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/minimal-shared": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minimal-shared/-/minimal-shared-1.0.7.tgz", + "integrity": "sha512-KP+8dQw43lTkE1vCqjV4dakapCP5sk5trFAo8d2kpJYBZQc3DrGoE1Q9uwKe0hDtbgSwE4zmVYdgmsatF9/JZw==", + "license": "MIT", + "dependencies": { + "es-toolkit": "^1.32.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/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/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-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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/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": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "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/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/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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz", + "integrity": "sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "apexcharts": ">=4.0.0", + "react": ">=0.13" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.1.tgz", + "integrity": "sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.1.tgz", + "integrity": "sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==", + "license": "MIT", + "dependencies": { + "react-router": "7.4.1" + }, + "engines": { + "node": ">=20.0.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/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "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/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/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/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.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/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/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "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-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/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/simplebar-core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.3.0.tgz", + "integrity": "sha512-LpWl3w0caz0bl322E68qsrRPpIn+rWBGAaEJ0lUJA7Xpr2sw92AkIhg6VWj988IefLXYh50ILatfAnbNoCFrlA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/simplebar-react": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.3.0.tgz", + "integrity": "sha512-sxzy+xRuU41He4tT4QLGYutchtOuye/xxVeq7xhyOiwMiHNK1ZpvbOTyy+7P0i7gfpXLGTJ8Bep8+4Mhdgtz/g==", + "license": "MIT", + "dependencies": { + "simplebar-core": "^1.3.0" + }, + "peerDependencies": { + "react": ">=16.8.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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "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": "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/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/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "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-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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "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/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.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.0.tgz", + "integrity": "sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.29.0", + "@typescript-eslint/parser": "8.29.0", + "@typescript-eslint/utils": "8.29.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "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-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.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unrs-resolver": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz", + "integrity": "sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.3.3", + "@unrs/resolver-binding-darwin-x64": "1.3.3", + "@unrs/resolver-binding-freebsd-x64": "1.3.3", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.3.3", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.3.3", + "@unrs/resolver-binding-linux-arm64-gnu": "1.3.3", + "@unrs/resolver-binding-linux-arm64-musl": "1.3.3", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.3.3", + "@unrs/resolver-binding-linux-s390x-gnu": "1.3.3", + "@unrs/resolver-binding-linux-x64-gnu": "1.3.3", + "@unrs/resolver-binding-linux-x64-musl": "1.3.3", + "@unrs/resolver-binding-wasm32-wasi": "1.3.3", + "@unrs/resolver-binding-win32-arm64-msvc": "1.3.3", + "@unrs/resolver-binding-win32-ia32-msvc": "1.3.3", + "@unrs/resolver-binding-win32-x64-msvc": "1.3.3" + } + }, + "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/vite": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", + "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.9.1.tgz", + "integrity": "sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.2", + "strip-ansi": "^7.1.0", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.12", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=7", + "meow": "^13.2.0", + "optionator": "^0.9.4", + "stylelint": ">=16", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.2" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "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/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "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..a4b79e4 --- /dev/null +++ b/package.json @@ -0,0 +1,70 @@ +{ + "name": "@minimal/material-kit-react", + "author": "minimals.cc", + "licence": "MIT", + "version": "3.0.0", + "private": false, + "type": "module", + "scripts": { + "dev": "vite", + "start": "vite preview", + "build": "tsc && vite build", + "lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"", + "lint:fix": "eslint --fix \"src/**/*.{js,jsx,ts,tsx}\"", + "lint:print": "npx eslint --print-config eslint.config.mjs > eslint-show-config.json", + "fm:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx}\"", + "fm:fix": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"", + "fix:all": "npm run lint:fix && npm run fm:fix", + "clean": "rm -rf node_modules .next out dist build", + "re:dev": "yarn clean && yarn install && yarn dev", + "re:build": "yarn clean && yarn install && yarn build", + "re:build-npm": "npm run clean && npm install && npm run build", + "tsc:dev": "yarn dev & yarn tsc:watch", + "tsc:watch": "tsc --noEmit --watch", + "tsc:print": "npx tsc --showConfig" + }, + "engines": { + "node": ">=20" + }, + "packageManager": "yarn@1.22.22", + "dependencies": { + "@emotion/cache": "^11.14.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@fontsource-variable/dm-sans": "^5.2.5", + "@fontsource/barlow": "^5.2.5", + "@iconify/react": "^5.2.1", + "@mui/lab": "^7.0.0-beta.10", + "@mui/material": "^7.0.1", + "apexcharts": "^4.5.0", + "dayjs": "^1.11.13", + "es-toolkit": "^1.34.1", + "minimal-shared": "^1.0.7", + "react": "^19.1.0", + "react-apexcharts": "^1.7.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.4.1", + "simplebar-react": "^3.3.0" + }, + "devDependencies": { + "@eslint/js": "^9.23.0", + "@types/node": "^22.14.0", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.1", + "@typescript-eslint/parser": "^8.29.0", + "@vitejs/plugin-react-swc": "^3.8.1", + "eslint": "^9.23.0", + "eslint-import-resolver-typescript": "^4.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-perfectionist": "^4.11.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^16.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.2", + "typescript-eslint": "^8.29.0", + "vite": "^6.2.5", + "vite-plugin-checker": "^0.9.1" + } +} diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 0000000..a3b4e4e --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,15 @@ +/** + * @type {import("prettier").Config} + * Need to restart IDE when changing configuration + * Open the command palette (Ctrl + Shift + P) and execute the command > Reload Window. + */ +const config = { + semi: true, + tabWidth: 2, + endOfLine: 'lf', + printWidth: 100, + singleQuote: true, + trailingComma: 'es5', +}; + +export default config; diff --git a/public/assets/background/overlay.jpg b/public/assets/background/overlay.jpg new file mode 100644 index 0000000..e6e7a32 Binary files /dev/null and b/public/assets/background/overlay.jpg differ diff --git a/public/assets/background/shape-square.svg b/public/assets/background/shape-square.svg new file mode 100644 index 0000000..b62e430 --- /dev/null +++ b/public/assets/background/shape-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/flags/ic-flag-de.svg b/public/assets/icons/flags/ic-flag-de.svg new file mode 100644 index 0000000..c361707 --- /dev/null +++ b/public/assets/icons/flags/ic-flag-de.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/flags/ic-flag-en.svg b/public/assets/icons/flags/ic-flag-en.svg new file mode 100644 index 0000000..485ad5c --- /dev/null +++ b/public/assets/icons/flags/ic-flag-en.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/flags/ic-flag-fr.svg b/public/assets/icons/flags/ic-flag-fr.svg new file mode 100644 index 0000000..2ae63a1 --- /dev/null +++ b/public/assets/icons/flags/ic-flag-fr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/glass/ic-glass-bag.svg b/public/assets/icons/glass/ic-glass-bag.svg new file mode 100644 index 0000000..5875b6f --- /dev/null +++ b/public/assets/icons/glass/ic-glass-bag.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/icons/glass/ic-glass-buy.svg b/public/assets/icons/glass/ic-glass-buy.svg new file mode 100644 index 0000000..07577a6 --- /dev/null +++ b/public/assets/icons/glass/ic-glass-buy.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/icons/glass/ic-glass-message.svg b/public/assets/icons/glass/ic-glass-message.svg new file mode 100644 index 0000000..e82d8d8 --- /dev/null +++ b/public/assets/icons/glass/ic-glass-message.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/icons/glass/ic-glass-users.svg b/public/assets/icons/glass/ic-glass-users.svg new file mode 100644 index 0000000..d69a579 --- /dev/null +++ b/public/assets/icons/glass/ic-glass-users.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/icons/navbar/ic-analytics.svg b/public/assets/icons/navbar/ic-analytics.svg new file mode 100644 index 0000000..2cf74af --- /dev/null +++ b/public/assets/icons/navbar/ic-analytics.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/assets/icons/navbar/ic-blog.svg b/public/assets/icons/navbar/ic-blog.svg new file mode 100644 index 0000000..6f8f006 --- /dev/null +++ b/public/assets/icons/navbar/ic-blog.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/navbar/ic-cart.svg b/public/assets/icons/navbar/ic-cart.svg new file mode 100644 index 0000000..bafbda9 --- /dev/null +++ b/public/assets/icons/navbar/ic-cart.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/assets/icons/navbar/ic-disabled.svg b/public/assets/icons/navbar/ic-disabled.svg new file mode 100644 index 0000000..5f7bda3 --- /dev/null +++ b/public/assets/icons/navbar/ic-disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/navbar/ic-lock.svg b/public/assets/icons/navbar/ic-lock.svg new file mode 100644 index 0000000..1545a1e --- /dev/null +++ b/public/assets/icons/navbar/ic-lock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/navbar/ic-user.svg b/public/assets/icons/navbar/ic-user.svg new file mode 100644 index 0000000..9f08419 --- /dev/null +++ b/public/assets/icons/navbar/ic-user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/icons/notification/ic-notification-chat.svg b/public/assets/icons/notification/ic-notification-chat.svg new file mode 100644 index 0000000..0fa6d65 --- /dev/null +++ b/public/assets/icons/notification/ic-notification-chat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/notification/ic-notification-mail.svg b/public/assets/icons/notification/ic-notification-mail.svg new file mode 100644 index 0000000..524fc75 --- /dev/null +++ b/public/assets/icons/notification/ic-notification-mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/notification/ic-notification-package.svg b/public/assets/icons/notification/ic-notification-package.svg new file mode 100644 index 0000000..87f3b79 --- /dev/null +++ b/public/assets/icons/notification/ic-notification-package.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/notification/ic-notification-shipping.svg b/public/assets/icons/notification/ic-notification-shipping.svg new file mode 100644 index 0000000..da3d5ad --- /dev/null +++ b/public/assets/icons/notification/ic-notification-shipping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/shape-avatar.svg b/public/assets/icons/shape-avatar.svg new file mode 100644 index 0000000..38aac7e --- /dev/null +++ b/public/assets/icons/shape-avatar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icons/workspaces/logo-1.webp b/public/assets/icons/workspaces/logo-1.webp new file mode 100644 index 0000000..daf350d Binary files /dev/null and b/public/assets/icons/workspaces/logo-1.webp differ diff --git a/public/assets/icons/workspaces/logo-2.webp b/public/assets/icons/workspaces/logo-2.webp new file mode 100644 index 0000000..3b629ef Binary files /dev/null and b/public/assets/icons/workspaces/logo-2.webp differ diff --git a/public/assets/icons/workspaces/logo-3.webp b/public/assets/icons/workspaces/logo-3.webp new file mode 100644 index 0000000..273fe07 Binary files /dev/null and b/public/assets/icons/workspaces/logo-3.webp differ diff --git a/public/assets/illustrations/illustration-404.svg b/public/assets/illustrations/illustration-404.svg new file mode 100644 index 0000000..bd59d64 --- /dev/null +++ b/public/assets/illustrations/illustration-404.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/illustrations/illustration-dashboard.webp b/public/assets/illustrations/illustration-dashboard.webp new file mode 100644 index 0000000..3c1d1a3 Binary files /dev/null and b/public/assets/illustrations/illustration-dashboard.webp differ diff --git a/public/assets/images/avatar/avatar-1.webp b/public/assets/images/avatar/avatar-1.webp new file mode 100644 index 0000000..d0860df Binary files /dev/null and b/public/assets/images/avatar/avatar-1.webp differ diff --git a/public/assets/images/avatar/avatar-10.webp b/public/assets/images/avatar/avatar-10.webp new file mode 100644 index 0000000..a523203 Binary files /dev/null and b/public/assets/images/avatar/avatar-10.webp differ diff --git a/public/assets/images/avatar/avatar-11.webp b/public/assets/images/avatar/avatar-11.webp new file mode 100644 index 0000000..7da3d8d Binary files /dev/null and b/public/assets/images/avatar/avatar-11.webp differ diff --git a/public/assets/images/avatar/avatar-12.webp b/public/assets/images/avatar/avatar-12.webp new file mode 100644 index 0000000..2ef5666 Binary files /dev/null and b/public/assets/images/avatar/avatar-12.webp differ diff --git a/public/assets/images/avatar/avatar-13.webp b/public/assets/images/avatar/avatar-13.webp new file mode 100644 index 0000000..d03b480 Binary files /dev/null and b/public/assets/images/avatar/avatar-13.webp differ diff --git a/public/assets/images/avatar/avatar-14.webp b/public/assets/images/avatar/avatar-14.webp new file mode 100644 index 0000000..80a8d29 Binary files /dev/null and b/public/assets/images/avatar/avatar-14.webp differ diff --git a/public/assets/images/avatar/avatar-15.webp b/public/assets/images/avatar/avatar-15.webp new file mode 100644 index 0000000..9ac9816 Binary files /dev/null and b/public/assets/images/avatar/avatar-15.webp differ diff --git a/public/assets/images/avatar/avatar-16.webp b/public/assets/images/avatar/avatar-16.webp new file mode 100644 index 0000000..7251b74 Binary files /dev/null and b/public/assets/images/avatar/avatar-16.webp differ diff --git a/public/assets/images/avatar/avatar-17.webp b/public/assets/images/avatar/avatar-17.webp new file mode 100644 index 0000000..5d5a465 Binary files /dev/null and b/public/assets/images/avatar/avatar-17.webp differ diff --git a/public/assets/images/avatar/avatar-18.webp b/public/assets/images/avatar/avatar-18.webp new file mode 100644 index 0000000..4c545e4 Binary files /dev/null and b/public/assets/images/avatar/avatar-18.webp differ diff --git a/public/assets/images/avatar/avatar-19.webp b/public/assets/images/avatar/avatar-19.webp new file mode 100644 index 0000000..6fc8ff3 Binary files /dev/null and b/public/assets/images/avatar/avatar-19.webp differ diff --git a/public/assets/images/avatar/avatar-2.webp b/public/assets/images/avatar/avatar-2.webp new file mode 100644 index 0000000..6af043a Binary files /dev/null and b/public/assets/images/avatar/avatar-2.webp differ diff --git a/public/assets/images/avatar/avatar-20.webp b/public/assets/images/avatar/avatar-20.webp new file mode 100644 index 0000000..8cb58ce Binary files /dev/null and b/public/assets/images/avatar/avatar-20.webp differ diff --git a/public/assets/images/avatar/avatar-21.webp b/public/assets/images/avatar/avatar-21.webp new file mode 100644 index 0000000..b88979b Binary files /dev/null and b/public/assets/images/avatar/avatar-21.webp differ diff --git a/public/assets/images/avatar/avatar-22.webp b/public/assets/images/avatar/avatar-22.webp new file mode 100644 index 0000000..2fe2c6b Binary files /dev/null and b/public/assets/images/avatar/avatar-22.webp differ diff --git a/public/assets/images/avatar/avatar-23.webp b/public/assets/images/avatar/avatar-23.webp new file mode 100644 index 0000000..5139e23 Binary files /dev/null and b/public/assets/images/avatar/avatar-23.webp differ diff --git a/public/assets/images/avatar/avatar-24.webp b/public/assets/images/avatar/avatar-24.webp new file mode 100644 index 0000000..e671720 Binary files /dev/null and b/public/assets/images/avatar/avatar-24.webp differ diff --git a/public/assets/images/avatar/avatar-25.webp b/public/assets/images/avatar/avatar-25.webp new file mode 100644 index 0000000..e5bce1b Binary files /dev/null and b/public/assets/images/avatar/avatar-25.webp differ diff --git a/public/assets/images/avatar/avatar-3.webp b/public/assets/images/avatar/avatar-3.webp new file mode 100644 index 0000000..9e7e161 Binary files /dev/null and b/public/assets/images/avatar/avatar-3.webp differ diff --git a/public/assets/images/avatar/avatar-4.webp b/public/assets/images/avatar/avatar-4.webp new file mode 100644 index 0000000..acdd7d7 Binary files /dev/null and b/public/assets/images/avatar/avatar-4.webp differ diff --git a/public/assets/images/avatar/avatar-5.webp b/public/assets/images/avatar/avatar-5.webp new file mode 100644 index 0000000..d02bbce Binary files /dev/null and b/public/assets/images/avatar/avatar-5.webp differ diff --git a/public/assets/images/avatar/avatar-6.webp b/public/assets/images/avatar/avatar-6.webp new file mode 100644 index 0000000..9519138 Binary files /dev/null and b/public/assets/images/avatar/avatar-6.webp differ diff --git a/public/assets/images/avatar/avatar-7.webp b/public/assets/images/avatar/avatar-7.webp new file mode 100644 index 0000000..b1272cb Binary files /dev/null and b/public/assets/images/avatar/avatar-7.webp differ diff --git a/public/assets/images/avatar/avatar-8.webp b/public/assets/images/avatar/avatar-8.webp new file mode 100644 index 0000000..35b9dfe Binary files /dev/null and b/public/assets/images/avatar/avatar-8.webp differ diff --git a/public/assets/images/avatar/avatar-9.webp b/public/assets/images/avatar/avatar-9.webp new file mode 100644 index 0000000..b0a8158 Binary files /dev/null and b/public/assets/images/avatar/avatar-9.webp differ diff --git a/public/assets/images/cover/cover-1.webp b/public/assets/images/cover/cover-1.webp new file mode 100644 index 0000000..9fa2560 Binary files /dev/null and b/public/assets/images/cover/cover-1.webp differ diff --git a/public/assets/images/cover/cover-10.webp b/public/assets/images/cover/cover-10.webp new file mode 100644 index 0000000..82ca790 Binary files /dev/null and b/public/assets/images/cover/cover-10.webp differ diff --git a/public/assets/images/cover/cover-11.webp b/public/assets/images/cover/cover-11.webp new file mode 100644 index 0000000..41ddd00 Binary files /dev/null and b/public/assets/images/cover/cover-11.webp differ diff --git a/public/assets/images/cover/cover-12.webp b/public/assets/images/cover/cover-12.webp new file mode 100644 index 0000000..a0ab39a Binary files /dev/null and b/public/assets/images/cover/cover-12.webp differ diff --git a/public/assets/images/cover/cover-13.webp b/public/assets/images/cover/cover-13.webp new file mode 100644 index 0000000..f650ead Binary files /dev/null and b/public/assets/images/cover/cover-13.webp differ diff --git a/public/assets/images/cover/cover-14.webp b/public/assets/images/cover/cover-14.webp new file mode 100644 index 0000000..cf7493d Binary files /dev/null and b/public/assets/images/cover/cover-14.webp differ diff --git a/public/assets/images/cover/cover-15.webp b/public/assets/images/cover/cover-15.webp new file mode 100644 index 0000000..8a82b5d Binary files /dev/null and b/public/assets/images/cover/cover-15.webp differ diff --git a/public/assets/images/cover/cover-16.webp b/public/assets/images/cover/cover-16.webp new file mode 100644 index 0000000..50abb72 Binary files /dev/null and b/public/assets/images/cover/cover-16.webp differ diff --git a/public/assets/images/cover/cover-17.webp b/public/assets/images/cover/cover-17.webp new file mode 100644 index 0000000..30f36d0 Binary files /dev/null and b/public/assets/images/cover/cover-17.webp differ diff --git a/public/assets/images/cover/cover-18.webp b/public/assets/images/cover/cover-18.webp new file mode 100644 index 0000000..ee64c4a Binary files /dev/null and b/public/assets/images/cover/cover-18.webp differ diff --git a/public/assets/images/cover/cover-19.webp b/public/assets/images/cover/cover-19.webp new file mode 100644 index 0000000..4f1962e Binary files /dev/null and b/public/assets/images/cover/cover-19.webp differ diff --git a/public/assets/images/cover/cover-2.webp b/public/assets/images/cover/cover-2.webp new file mode 100644 index 0000000..5a5d210 Binary files /dev/null and b/public/assets/images/cover/cover-2.webp differ diff --git a/public/assets/images/cover/cover-20.webp b/public/assets/images/cover/cover-20.webp new file mode 100644 index 0000000..6e26beb Binary files /dev/null and b/public/assets/images/cover/cover-20.webp differ diff --git a/public/assets/images/cover/cover-21.webp b/public/assets/images/cover/cover-21.webp new file mode 100644 index 0000000..7f94575 Binary files /dev/null and b/public/assets/images/cover/cover-21.webp differ diff --git a/public/assets/images/cover/cover-22.webp b/public/assets/images/cover/cover-22.webp new file mode 100644 index 0000000..fc88ae6 Binary files /dev/null and b/public/assets/images/cover/cover-22.webp differ diff --git a/public/assets/images/cover/cover-23.webp b/public/assets/images/cover/cover-23.webp new file mode 100644 index 0000000..ab70067 Binary files /dev/null and b/public/assets/images/cover/cover-23.webp differ diff --git a/public/assets/images/cover/cover-24.webp b/public/assets/images/cover/cover-24.webp new file mode 100644 index 0000000..d6b9fb7 Binary files /dev/null and b/public/assets/images/cover/cover-24.webp differ diff --git a/public/assets/images/cover/cover-3.webp b/public/assets/images/cover/cover-3.webp new file mode 100644 index 0000000..5b023b8 Binary files /dev/null and b/public/assets/images/cover/cover-3.webp differ diff --git a/public/assets/images/cover/cover-4.webp b/public/assets/images/cover/cover-4.webp new file mode 100644 index 0000000..0e9ecbf Binary files /dev/null and b/public/assets/images/cover/cover-4.webp differ diff --git a/public/assets/images/cover/cover-5.webp b/public/assets/images/cover/cover-5.webp new file mode 100644 index 0000000..8f1785f Binary files /dev/null and b/public/assets/images/cover/cover-5.webp differ diff --git a/public/assets/images/cover/cover-6.webp b/public/assets/images/cover/cover-6.webp new file mode 100644 index 0000000..bb46a04 Binary files /dev/null and b/public/assets/images/cover/cover-6.webp differ diff --git a/public/assets/images/cover/cover-7.webp b/public/assets/images/cover/cover-7.webp new file mode 100644 index 0000000..211355e Binary files /dev/null and b/public/assets/images/cover/cover-7.webp differ diff --git a/public/assets/images/cover/cover-8.webp b/public/assets/images/cover/cover-8.webp new file mode 100644 index 0000000..70cd3fb Binary files /dev/null and b/public/assets/images/cover/cover-8.webp differ diff --git a/public/assets/images/cover/cover-9.webp b/public/assets/images/cover/cover-9.webp new file mode 100644 index 0000000..7445854 Binary files /dev/null and b/public/assets/images/cover/cover-9.webp differ diff --git a/public/assets/images/minimal-free-preview.jpg b/public/assets/images/minimal-free-preview.jpg new file mode 100644 index 0000000..91eb756 Binary files /dev/null and b/public/assets/images/minimal-free-preview.jpg differ diff --git a/public/assets/images/product/product-1.webp b/public/assets/images/product/product-1.webp new file mode 100644 index 0000000..75659df Binary files /dev/null and b/public/assets/images/product/product-1.webp differ diff --git a/public/assets/images/product/product-10.webp b/public/assets/images/product/product-10.webp new file mode 100644 index 0000000..65e2c60 Binary files /dev/null and b/public/assets/images/product/product-10.webp differ diff --git a/public/assets/images/product/product-11.webp b/public/assets/images/product/product-11.webp new file mode 100644 index 0000000..17c3bc8 Binary files /dev/null and b/public/assets/images/product/product-11.webp differ diff --git a/public/assets/images/product/product-12.webp b/public/assets/images/product/product-12.webp new file mode 100644 index 0000000..2af581e Binary files /dev/null and b/public/assets/images/product/product-12.webp differ diff --git a/public/assets/images/product/product-13.webp b/public/assets/images/product/product-13.webp new file mode 100644 index 0000000..c1f403b Binary files /dev/null and b/public/assets/images/product/product-13.webp differ diff --git a/public/assets/images/product/product-14.webp b/public/assets/images/product/product-14.webp new file mode 100644 index 0000000..a5896f8 Binary files /dev/null and b/public/assets/images/product/product-14.webp differ diff --git a/public/assets/images/product/product-15.webp b/public/assets/images/product/product-15.webp new file mode 100644 index 0000000..475a7af Binary files /dev/null and b/public/assets/images/product/product-15.webp differ diff --git a/public/assets/images/product/product-16.webp b/public/assets/images/product/product-16.webp new file mode 100644 index 0000000..1b3b7ed Binary files /dev/null and b/public/assets/images/product/product-16.webp differ diff --git a/public/assets/images/product/product-17.webp b/public/assets/images/product/product-17.webp new file mode 100644 index 0000000..ddd8da0 Binary files /dev/null and b/public/assets/images/product/product-17.webp differ diff --git a/public/assets/images/product/product-18.webp b/public/assets/images/product/product-18.webp new file mode 100644 index 0000000..9ae8e26 Binary files /dev/null and b/public/assets/images/product/product-18.webp differ diff --git a/public/assets/images/product/product-19.webp b/public/assets/images/product/product-19.webp new file mode 100644 index 0000000..c5017f6 Binary files /dev/null and b/public/assets/images/product/product-19.webp differ diff --git a/public/assets/images/product/product-2.webp b/public/assets/images/product/product-2.webp new file mode 100644 index 0000000..65120df Binary files /dev/null and b/public/assets/images/product/product-2.webp differ diff --git a/public/assets/images/product/product-20.webp b/public/assets/images/product/product-20.webp new file mode 100644 index 0000000..8931720 Binary files /dev/null and b/public/assets/images/product/product-20.webp differ diff --git a/public/assets/images/product/product-21.webp b/public/assets/images/product/product-21.webp new file mode 100644 index 0000000..c7795b1 Binary files /dev/null and b/public/assets/images/product/product-21.webp differ diff --git a/public/assets/images/product/product-22.webp b/public/assets/images/product/product-22.webp new file mode 100644 index 0000000..b96c809 Binary files /dev/null and b/public/assets/images/product/product-22.webp differ diff --git a/public/assets/images/product/product-23.webp b/public/assets/images/product/product-23.webp new file mode 100644 index 0000000..a38a734 Binary files /dev/null and b/public/assets/images/product/product-23.webp differ diff --git a/public/assets/images/product/product-24.webp b/public/assets/images/product/product-24.webp new file mode 100644 index 0000000..643a1a6 Binary files /dev/null and b/public/assets/images/product/product-24.webp differ diff --git a/public/assets/images/product/product-3.webp b/public/assets/images/product/product-3.webp new file mode 100644 index 0000000..07b5312 Binary files /dev/null and b/public/assets/images/product/product-3.webp differ diff --git a/public/assets/images/product/product-4.webp b/public/assets/images/product/product-4.webp new file mode 100644 index 0000000..c18893e Binary files /dev/null and b/public/assets/images/product/product-4.webp differ diff --git a/public/assets/images/product/product-5.webp b/public/assets/images/product/product-5.webp new file mode 100644 index 0000000..014c146 Binary files /dev/null and b/public/assets/images/product/product-5.webp differ diff --git a/public/assets/images/product/product-6.webp b/public/assets/images/product/product-6.webp new file mode 100644 index 0000000..3ff7420 Binary files /dev/null and b/public/assets/images/product/product-6.webp differ diff --git a/public/assets/images/product/product-7.webp b/public/assets/images/product/product-7.webp new file mode 100644 index 0000000..6a0e943 Binary files /dev/null and b/public/assets/images/product/product-7.webp differ diff --git a/public/assets/images/product/product-8.webp b/public/assets/images/product/product-8.webp new file mode 100644 index 0000000..0aae38a Binary files /dev/null and b/public/assets/images/product/product-8.webp differ diff --git a/public/assets/images/product/product-9.webp b/public/assets/images/product/product-9.webp new file mode 100644 index 0000000..2c86ff6 Binary files /dev/null and b/public/assets/images/product/product-9.webp differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..5c435e6 Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/_mock/_data.ts b/src/_mock/_data.ts new file mode 100644 index 0000000..056177e --- /dev/null +++ b/src/_mock/_data.ts @@ -0,0 +1,210 @@ +import { + _id, + _price, + _times, + _company, + _boolean, + _fullName, + _taskNames, + _postTitles, + _description, + _productNames, +} from './_mock'; + +// ---------------------------------------------------------------------- + +export const _myAccount = { + displayName: 'Jaydon Frankie', + email: 'demo@minimals.cc', + photoURL: '/assets/images/avatar/avatar-25.webp', +}; + +// ---------------------------------------------------------------------- + +export const _users = [...Array(24)].map((_, index) => ({ + id: _id(index), + name: _fullName(index), + company: _company(index), + isVerified: _boolean(index), + avatarUrl: `/assets/images/avatar/avatar-${index + 1}.webp`, + status: index % 4 ? 'active' : 'banned', + role: + [ + 'Leader', + 'Hr Manager', + 'UI Designer', + 'UX Designer', + 'UI/UX Designer', + 'Project Manager', + 'Backend Developer', + 'Full Stack Designer', + 'Front End Developer', + 'Full Stack Developer', + ][index] || 'UI Designer', +})); + +// ---------------------------------------------------------------------- + +export const _posts = [...Array(23)].map((_, index) => ({ + id: _id(index), + title: _postTitles(index), + description: _description(index), + coverUrl: `/assets/images/cover/cover-${index + 1}.webp`, + totalViews: 8829, + totalComments: 7977, + totalShares: 8556, + totalFavorites: 8870, + postedAt: _times(index), + author: { + name: _fullName(index), + avatarUrl: `/assets/images/avatar/avatar-${index + 1}.webp`, + }, +})); + +// ---------------------------------------------------------------------- + +const COLORS = [ + '#00AB55', + '#000000', + '#FFFFFF', + '#FFC0CB', + '#FF4842', + '#1890FF', + '#94D82D', + '#FFC107', +]; + +export const _products = [...Array(24)].map((_, index) => { + const setIndex = index + 1; + + return { + id: _id(index), + price: _price(index), + name: _productNames(index), + priceSale: setIndex % 3 ? null : _price(index), + coverUrl: `/assets/images/product/product-${setIndex}.webp`, + colors: + (setIndex === 1 && COLORS.slice(0, 2)) || + (setIndex === 2 && COLORS.slice(1, 3)) || + (setIndex === 3 && COLORS.slice(2, 4)) || + (setIndex === 4 && COLORS.slice(3, 6)) || + (setIndex === 23 && COLORS.slice(4, 6)) || + (setIndex === 24 && COLORS.slice(5, 6)) || + COLORS, + status: + ([1, 3, 5].includes(setIndex) && 'sale') || ([4, 8, 12].includes(setIndex) && 'new') || '', + }; +}); + +// ---------------------------------------------------------------------- + +export const _langs = [ + { + value: 'en', + label: 'English', + icon: '/assets/icons/flags/ic-flag-en.svg', + }, + { + value: 'de', + label: 'German', + icon: '/assets/icons/flags/ic-flag-de.svg', + }, + { + value: 'fr', + label: 'French', + icon: '/assets/icons/flags/ic-flag-fr.svg', + }, +]; + +// ---------------------------------------------------------------------- + +export const _timeline = [...Array(5)].map((_, index) => ({ + id: _id(index), + title: [ + '1983, orders, $4220', + '12 Invoices have been paid', + 'Order #37745 from September', + 'New order placed #XF-2356', + 'New order placed #XF-2346', + ][index], + type: `order${index + 1}`, + time: _times(index), +})); + +export const _traffic = [ + { + value: 'facebook', + label: 'Facebook', + total: 19500, + }, + { + value: 'google', + label: 'Google', + total: 91200, + }, + { + value: 'linkedin', + label: 'Linkedin', + total: 69800, + }, + { + value: 'twitter', + label: 'Twitter', + total: 84900, + }, +]; + +export const _tasks = Array.from({ length: 5 }, (_, index) => ({ + id: _id(index), + name: _taskNames(index), +})); + +// ---------------------------------------------------------------------- + +export const _notifications = [ + { + id: _id(1), + title: 'Your order is placed', + description: 'waiting for shipping', + avatarUrl: null, + type: 'order-placed', + postedAt: _times(1), + isUnRead: true, + }, + { + id: _id(2), + title: _fullName(2), + description: 'answered to your comment on the Minimal', + avatarUrl: '/assets/images/avatar/avatar-2.webp', + type: 'friend-interactive', + postedAt: _times(2), + isUnRead: true, + }, + { + id: _id(3), + title: 'You have new message', + description: '5 unread messages', + avatarUrl: null, + type: 'chat-message', + postedAt: _times(3), + isUnRead: false, + }, + { + id: _id(4), + title: 'You have new mail', + description: 'sent from Guido Padberg', + avatarUrl: null, + type: 'mail', + postedAt: _times(4), + isUnRead: false, + }, + { + id: _id(5), + title: 'Delivery processing', + description: 'Your order is being shipped', + avatarUrl: null, + type: 'order-shipped', + postedAt: _times(5), + isUnRead: false, + }, +]; diff --git a/src/_mock/_mock.ts b/src/_mock/_mock.ts new file mode 100644 index 0000000..46f120b --- /dev/null +++ b/src/_mock/_mock.ts @@ -0,0 +1,232 @@ +export const _id = (index: number) => `e99f09a7-dd88-49d5-b1c8-1daf80c2d7b${index}`; + +export const _times = (index: number) => + // 'MM/DD/YYYY' + [ + '11/08/2023', + '04/09/2024', + '09/12/2023', + '01/01/2024', + '04/23/2024', + '02/29/2024', + '05/14/2024', + '01/13/2024', + '06/22/2024', + '10/05/2023', + '07/11/2024', + '05/22/2024', + '03/29/2024', + '08/29/2023', + '11/19/2023', + '10/24/2023', + '12/02/2023', + '02/13/2024', + '09/19/2023', + '04/17/2024', + '12/18/2023', + '06/27/2024', + '10/19/2023', + '08/09/2024', + ][index]; + +export const _fullName = (index: number) => + [ + 'Billy Stoltenberg', + 'Eloise Ebert', + 'Teresa Luettgen', + 'Salvador Mayert', + 'Dr. Guadalupe Rath', + 'Kelvin Pouros', + 'Thelma Langworth', + 'Kristen Wunsch', + 'Steve Welch', + 'Brian Jacobs', + 'Lillie Schultz', + 'Mr. Conrad Spinka', + 'Charlene Krajcik', + 'Kerry Kuhlman', + 'Betty Hammes', + 'Tony Paucek PhD', + 'Sherri Davis', + 'Angel Rolfson-Kulas', + 'Dr. Lee Doyle-Grant', + 'Cheryl Romaguera', + 'Billy Braun', + 'Adam Trantow', + 'Brandon Von', + 'Willis Ankunding', + ][index]; + +export const _price = (index: number) => + [ + 35.17, 57.22, 64.78, 50.79, 9.57, 61.46, 96.73, 63.04, 33.18, 36.3, 54.42, 20.52, 62.82, 19.96, + 25.93, 70.39, 23.11, 67.23, 14.31, 31.5, 26.72, 44.8, 37.87, 75.53, + ][index]; + +export const _company = (index: number) => + [ + 'Medhurst, Moore and Franey', + 'Hahn, Homenick and Lind', + 'Larkin LLC', + 'Stamm, Larson and Mertz', + 'Spencer, Raynor and Langosh', + 'Lehner - Feeney', + 'Leuschke, Harris and Kuhlman', + 'Gutmann - Kassulke', + 'Turcotte - Runolfsson', + 'Howe - Anderson', + 'Sipes - Yost', + 'Johns - Aufderhar', + 'Schmidt LLC', + 'Smitham - Gerlach', + 'Waelchi - VonRueden', + 'Padberg - Macejkovic', + 'Lemke - Ferry', + 'Koch and Sons', + 'Klein - Rolfson', + 'Weimann LLC', + 'White, Cassin and Goldner', + 'Mohr, Langworth and Hills', + 'Mitchell, Volkman and Prosacco', + 'Streich Group', + ][index]; + +export const _boolean = (index: number) => + [ + true, + false, + true, + false, + true, + true, + true, + false, + false, + true, + false, + true, + true, + false, + true, + false, + false, + true, + false, + false, + false, + true, + true, + false, + ][index]; + +export const _postTitles = (index: number) => + [ + 'Whiteboard Templates By Industry Leaders', + 'Tesla Cybertruck-inspired camper trailer for Tesla fans who can’t just wait for the truck!', + 'Designify Agency Landing Page Design', + '✨What is Done is Done ✨', + 'Fresh Prince', + 'Six Socks Studio', + 'vincenzo de cotiis’ crossing over showcases a research on contamination', + 'Simple, Great Looking Animations in Your Project | Video Tutorial', + '40 Free Serif Fonts for Digital Designers', + 'Examining the Evolution of the Typical Web Design Client', + 'Katie Griffin loves making that homey art', + 'The American Dream retold through mid-century railroad graphics', + 'Illustration System Design', + 'CarZio-Delivery Driver App SignIn/SignUp', + 'How to create a client-serverless Jamstack app using Netlify, Gatsby and Fauna', + 'Tylko Organise effortlessly -3D & Motion Design', + 'RAYO ?? A expanded visual arts festival identity', + 'Anthony Burrill and Wired mag’s Andrew Diprose discuss how they made January’s Change Everything cover', + 'Inside the Mind of Samuel Day', + 'Portfolio Review: Is This Portfolio Too Creative?', + 'Akkers van Margraten', + 'Gradient Ticket icon', + 'Here’s a Dyson motorcycle concept that doesn’t ‘suck’!', + 'How to Animate a SVG with border-image', + ][index]; + +export const _description = (index: number) => + [ + 'The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J', + 'New range of formal shirts are designed keeping you in mind. With fits and styling that will make you stand apart', + 'Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals', + 'The Football Is Good For Training And Recreational Purposes', + 'New ABC 13 9370, 13.3, 5th Gen CoreA5-8250U, 8GB RAM, 256GB SSD, power UHD Graphics, OS 10 Home, OS Office A & J 2016', + 'Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals', + 'Carbonite web goalkeeper gloves are ergonomically designed to give easy fit', + 'The Apollotech B340 is an affordable wireless mouse with reliable connectivity, 12 months battery life and modern design', + 'The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J', + 'The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive', + 'The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive', + 'The Apollotech B340 is an affordable wireless mouse with reliable connectivity, 12 months battery life and modern design', + 'New range of formal shirts are designed keeping you in mind. With fits and styling that will make you stand apart', + "Boston's most advanced compression wear technology increases muscle oxygenation, stabilizes active muscles", + 'New range of formal shirts are designed keeping you in mind. With fits and styling that will make you stand apart', + 'Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals', + 'Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals', + 'The beautiful range of Apple Naturalé that has an exciting mix of natural ingredients. With the Goodness of 100% Natural Ingredients', + "Boston's most advanced compression wear technology increases muscle oxygenation, stabilizes active muscles", + 'New ABC 13 9370, 13.3, 5th Gen CoreA5-8250U, 8GB RAM, 256GB SSD, power UHD Graphics, OS 10 Home, OS Office A & J 2016', + 'The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J', + 'Ergonomic executive chair upholstered in bonded black leather and PVC padded seat and back for all-day comfort and support', + 'The Football Is Good For Training And Recreational Purposes', + 'The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive', + ][index]; + +export const _taskNames = (index: number) => + [ + `Prepare Monthly Financial Report`, + `Design New Marketing Campaign`, + `Analyze Customer Feedback`, + `Update Website Content`, + `Conduct Market Research`, + `Develop Software Application`, + `Organize Team Meeting`, + `Create Social Media Posts`, + `Review Project Plan`, + `Implement Security Protocols`, + `Write Technical Documentation`, + `Test New Product Features`, + `Manage Client Inquiries`, + `Train New Employees`, + `Coordinate Logistics`, + `Monitor Network Performance`, + `Develop Training Materials`, + `Draft Press Release`, + `Prepare Budget Proposal`, + `Evaluate Vendor Proposals`, + `Perform Data Analysis`, + `Conduct Quality Assurance`, + `Plan Event Logistics`, + `Optimize SEO Strategies`, + ][index]; + +export const _productNames = (index: number) => + [ + 'Nike Air Force 1 NDESTRUKT', + 'Nike Space Hippie 04', + 'Nike Air Zoom Pegasus 37 A.I.R. Chaz Bear', + 'Nike Blazer Low 77 Vintage', + 'Nike ZoomX SuperRep Surge', + 'Zoom Freak 2', + 'Nike Air Max Zephyr', + 'Jordan Delta', + 'Air Jordan XXXV PF', + 'Nike Waffle Racer Crater', + 'Kyrie 7 EP Sisterhood', + 'Nike Air Zoom BB NXT', + 'Nike Air Force 1 07 LX', + 'Nike Air Force 1 Shadow SE', + 'Nike Air Zoom Tempo NEXT%', + 'Nike DBreak-Type', + 'Nike Air Max Up', + 'Nike Air Max 270 React ENG', + 'NikeCourt Royale', + 'Nike Air Zoom Pegasus 37 Premium', + 'Nike Air Zoom SuperRep', + 'NikeCourt Royale', + 'Nike React Art3mis', + 'Nike React Infinity Run Flyknit A.I.R. Chaz Bear', + ][index]; diff --git a/src/_mock/index.ts b/src/_mock/index.ts new file mode 100644 index 0000000..6a726d9 --- /dev/null +++ b/src/_mock/index.ts @@ -0,0 +1,2 @@ +export * from './_mock'; +export * from './_data'; diff --git a/src/app.tsx b/src/app.tsx new file mode 100644 index 0000000..6062fe5 --- /dev/null +++ b/src/app.tsx @@ -0,0 +1,59 @@ +import 'src/global.css'; + +import { useEffect } from 'react'; + +import Fab from '@mui/material/Fab'; + +import { usePathname } from 'src/routes/hooks'; + +import { ThemeProvider } from 'src/theme/theme-provider'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type AppProps = { + children: React.ReactNode; +}; + +export default function App({ children }: AppProps) { + useScrollToTop(); + + const githubButton = () => ( + + + + ); + + return ( + + {children} + {githubButton()} + + ); +} + +// ---------------------------------------------------------------------- + +function useScrollToTop() { + const pathname = usePathname(); + + useEffect(() => { + window.scrollTo(0, 0); + }, [pathname]); + + return null; +} diff --git a/src/components/chart/chart.tsx b/src/components/chart/chart.tsx new file mode 100644 index 0000000..1d78f38 --- /dev/null +++ b/src/components/chart/chart.tsx @@ -0,0 +1,48 @@ +import { lazy, Suspense } from 'react'; +import { useIsClient } from 'minimal-shared/hooks'; +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { chartClasses } from './classes'; +import { ChartLoading } from './components'; + +import type { ChartProps } from './types'; + +// ---------------------------------------------------------------------- + +const LazyChart = lazy(() => + import('react-apexcharts').then((module) => ({ default: module.default })) +); + +export function Chart({ type, series, options, slotProps, className, sx, ...other }: ChartProps) { + const isClient = useIsClient(); + + const renderFallback = () => ; + + return ( + + {isClient ? ( + + + + ) : ( + renderFallback() + )} + + ); +} + +// ---------------------------------------------------------------------- + +const ChartRoot = styled('div')(({ theme }) => ({ + width: '100%', + flexShrink: 0, + position: 'relative', + borderRadius: theme.shape.borderRadius * 1.5, +})); diff --git a/src/components/chart/classes.ts b/src/components/chart/classes.ts new file mode 100644 index 0000000..5557a59 --- /dev/null +++ b/src/components/chart/classes.ts @@ -0,0 +1,19 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const chartClasses = { + root: createClasses('chart__root'), + loading: createClasses('chart__loading'), + legends: { + root: createClasses('chart__legends__root'), + item: { + wrap: createClasses('chart__legends__item__wrap'), + root: createClasses('chart__legends__item__root'), + dot: createClasses('chart__legends__item__dot'), + icon: createClasses('chart__legends__item__icon'), + label: createClasses('chart__legends__item__label'), + value: createClasses('chart__legends__item__value'), + }, + }, +}; diff --git a/src/components/chart/components/chart-legends.tsx b/src/components/chart/components/chart-legends.tsx new file mode 100644 index 0000000..ec7c113 --- /dev/null +++ b/src/components/chart/components/chart-legends.tsx @@ -0,0 +1,128 @@ +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { chartClasses } from '../classes'; + +// ---------------------------------------------------------------------- + +export type ChartLegendsProps = React.ComponentProps & { + labels?: string[]; + colors?: string[]; + values?: string[]; + sublabels?: string[]; + icons?: React.ReactNode[]; + slotProps?: { + wrapper?: React.ComponentProps; + root?: React.ComponentProps; + dot?: React.ComponentProps; + icon?: React.ComponentProps; + value?: React.ComponentProps; + label?: React.ComponentProps; + }; +}; + +export function ChartLegends({ + sx, + className, + slotProps, + icons = [], + values = [], + labels = [], + colors = [], + sublabels = [], + ...other +}: ChartLegendsProps) { + return ( + + {labels.map((series, index) => ( + + + {icons.length ? ( + + {icons[index]} + + ) : ( + + )} + + + {series} + {!!sublabels.length && <> {` (${sublabels[index]})`}} + + + + {values && ( + + {values[index]} + + )} + + ))} + + ); +} + +// ---------------------------------------------------------------------- + +const ListRoot = styled('ul')(({ theme }) => ({ + display: 'flex', + flexWrap: 'wrap', + gap: theme.spacing(2), +})); + +const ItemWrap = styled('li')(() => ({ + display: 'inline-flex', + flexDirection: 'column', +})); + +const ItemRoot = styled('div')(({ theme }) => ({ + gap: 6, + alignItems: 'center', + display: 'inline-flex', + justifyContent: 'flex-start', + fontSize: theme.typography.pxToRem(13), + fontWeight: theme.typography.fontWeightMedium, +})); + +const ItemIcon = styled('span')({ + display: 'inline-flex', + color: 'var(--icon-color)', + /** + * As ':first-child' for ssr + * https://github.com/emotion-js/emotion/issues/1105#issuecomment-1126025608 + */ + '& > :first-of-type:not(style):not(:first-of-type ~ *), & > style + *': { width: 20, height: 20 }, +}); + +const ItemDot = styled('span')({ + width: 12, + height: 12, + flexShrink: 0, + display: 'flex', + borderRadius: '50%', + position: 'relative', + alignItems: 'center', + justifyContent: 'center', + color: 'var(--icon-color)', + backgroundColor: 'currentColor', +}); + +const ItemLabel = styled('span')({ flexShrink: 0 }); + +const ItemValue = styled('span')(({ theme }) => ({ + ...theme.typography.h6, + marginTop: theme.spacing(1), +})); diff --git a/src/components/chart/components/chart-loading.tsx b/src/components/chart/components/chart-loading.tsx new file mode 100644 index 0000000..f4e031e --- /dev/null +++ b/src/components/chart/components/chart-loading.tsx @@ -0,0 +1,51 @@ +import type { BoxProps } from '@mui/material/Box'; + +import { mergeClasses } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Skeleton from '@mui/material/Skeleton'; + +import { chartClasses } from '../classes'; + +import type { ChartProps } from '../types'; + +// ---------------------------------------------------------------------- + +export type ChartLoadingProps = BoxProps & Pick; + +export function ChartLoading({ sx, className, type, ...other }: ChartLoadingProps) { + const circularTypes: ChartProps['type'][] = ['donut', 'radialBar', 'pie', 'polarArea']; + + return ( + ({ + top: 0, + left: 0, + width: 1, + zIndex: 9, + height: 1, + p: 'inherit', + overflow: 'hidden', + alignItems: 'center', + position: 'absolute', + borderRadius: 'inherit', + justifyContent: 'center', + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + + + ); +} diff --git a/src/components/chart/components/index.ts b/src/components/chart/components/index.ts new file mode 100644 index 0000000..748900a --- /dev/null +++ b/src/components/chart/components/index.ts @@ -0,0 +1,3 @@ +export * from './chart-legends'; + +export * from './chart-loading'; diff --git a/src/components/chart/index.ts b/src/components/chart/index.ts new file mode 100644 index 0000000..9765b2b --- /dev/null +++ b/src/components/chart/index.ts @@ -0,0 +1,7 @@ +export * from './chart'; + +export * from './use-chart'; + +export * from './components'; + +export type * from './types'; diff --git a/src/components/chart/styles.css b/src/components/chart/styles.css new file mode 100644 index 0000000..4f16c93 --- /dev/null +++ b/src/components/chart/styles.css @@ -0,0 +1,56 @@ +.apexcharts-canvas { + /** + * Tooltip + */ + .apexcharts-tooltip { + min-width: 80px; + border-radius: 10px; + backdrop-filter: blur(6px); + color: var(--palette-text-primary); + box-shadow: var(--customShadows-dropdown); + background-color: rgba(var(--palette-background-defaultChannel) / 0.9); + } + .apexcharts-xaxistooltip { + border-radius: 10px; + border-color: transparent; + backdrop-filter: blur(6px); + color: var(--palette-text-primary); + box-shadow: var(--customShadows-dropdown); + background-color: rgba(var(--palette-background-defaultChannel) / 0.9); + &::before { + border-bottom-color: rgba(var(--palette-grey-500Channel) / 0.16); + } + &::after { + border-bottom-color: rgba(var(--palette-background-defaultChannel) / 0.9); + } + } + .apexcharts-tooltip-title { + font-weight: 700; + text-align: center; + color: var(--palette-text-secondary); + background-color: var(--palette-background-neutral); + } + /** + * Tooltip: group + */ + .apexcharts-tooltip-series-group { + padding: 4px 12px; + } + .apexcharts-tooltip-marker { + margin-right: 8px; + } + /** + * Legend + */ + .apexcharts-legend { + padding: 0; + } + .apexcharts-legend-marker { + margin-right: 6px; + } + .apexcharts-legend-text { + margin-left: 0; + padding-left: 0; + line-height: 18px; + } +} diff --git a/src/components/chart/types.ts b/src/components/chart/types.ts new file mode 100644 index 0000000..0e3922a --- /dev/null +++ b/src/components/chart/types.ts @@ -0,0 +1,14 @@ +import type { Theme, SxProps } from '@mui/material/styles'; +import type { Props as ApexProps } from 'react-apexcharts'; + +// ---------------------------------------------------------------------- + +export type ChartOptions = ApexProps['options']; + +export type ChartProps = React.ComponentProps<'div'> & + Pick & { + sx?: SxProps; + slotProps?: { + loading?: SxProps; + }; + }; diff --git a/src/components/chart/use-chart.ts b/src/components/chart/use-chart.ts new file mode 100644 index 0000000..2deca76 --- /dev/null +++ b/src/components/chart/use-chart.ts @@ -0,0 +1,227 @@ +import type { Theme } from '@mui/material/styles'; + +import { merge } from 'es-toolkit'; +import { varAlpha } from 'minimal-shared/utils'; + +import { useTheme } from '@mui/material/styles'; + +import type { ChartOptions } from './types'; + +// ---------------------------------------------------------------------- + +export function useChart(updatedOptions?: ChartOptions): ChartOptions { + const theme = useTheme(); + + const baseOptions = baseChartOptions(theme) ?? {}; + + return merge(baseOptions, updatedOptions ?? {}); +} + +// ---------------------------------------------------------------------- + +const baseChartOptions = (theme: Theme): ChartOptions => { + const LABEL_TOTAL = { + show: true, + label: 'Total', + color: theme.vars.palette.text.secondary, + fontSize: theme.typography.subtitle2.fontSize as string, + fontWeight: theme.typography.subtitle2.fontWeight, + }; + + const LABEL_VALUE = { + offsetY: 8, + color: theme.vars.palette.text.primary, + fontSize: theme.typography.h4.fontSize as string, + fontWeight: theme.typography.h4.fontWeight, + }; + + return { + /** ************************************** + * Chart + * https://apexcharts.com/docs/options/chart/animations/ + *************************************** */ + chart: { + toolbar: { show: false }, + zoom: { enabled: false }, + parentHeightOffset: 0, + fontFamily: theme.typography.fontFamily, + foreColor: theme.vars.palette.text.disabled, + animations: { + enabled: true, + speed: 360, + animateGradually: { enabled: true, delay: 120 }, + dynamicAnimation: { enabled: true, speed: 360 }, + }, + }, + + /** ************************************** + * Colors + * https://apexcharts.com/docs/options/colors/ + *************************************** */ + colors: [ + theme.palette.primary.main, + theme.palette.warning.main, + theme.palette.info.main, + theme.palette.error.main, + theme.palette.success.main, + theme.palette.warning.dark, + theme.palette.success.darker, + theme.palette.info.dark, + theme.palette.info.darker, + ], + + /** ************************************** + * States + * https://apexcharts.com/docs/options/states/ + *************************************** */ + states: { + hover: { filter: { type: 'darken' } }, + active: { filter: { type: 'darken' } }, + }, + + /** ************************************** + * Fill + * https://apexcharts.com/docs/options/fill/ + *************************************** */ + fill: { + opacity: 1, + gradient: { + type: 'vertical', + shadeIntensity: 0, + opacityFrom: 0.4, + opacityTo: 0, + stops: [0, 100], + }, + }, + + /** ************************************** + * Data labels + * https://apexcharts.com/docs/options/datalabels/ + *************************************** */ + dataLabels: { enabled: false }, + + /** ************************************** + * Stroke + * https://apexcharts.com/docs/options/stroke/ + *************************************** */ + stroke: { width: 2.5, curve: 'smooth', lineCap: 'round' }, + + /** ************************************** + * Grid + * https://apexcharts.com/docs/options/grid/ + *************************************** */ + grid: { + strokeDashArray: 3, + borderColor: theme.vars.palette.divider, + padding: { top: 0, right: 0, bottom: 0 }, + xaxis: { lines: { show: false } }, + }, + + /** ************************************** + * Axis + * https://apexcharts.com/docs/options/xaxis/ + * https://apexcharts.com/docs/options/yaxis/ + *************************************** */ + xaxis: { axisBorder: { show: false }, axisTicks: { show: false } }, + yaxis: { tickAmount: 5 }, + + /** ************************************** + * Markers + * https://apexcharts.com/docs/options/markers/ + *************************************** */ + markers: { + size: 0, + strokeColors: theme.vars.palette.background.paper, + }, + + /** ************************************** + * Tooltip + *************************************** */ + tooltip: { theme: 'false', fillSeriesColor: false, x: { show: true } }, + + /** ************************************** + * Legend + * https://apexcharts.com/docs/options/legend/ + *************************************** */ + legend: { + show: false, + position: 'top', + fontWeight: 500, + fontSize: '13px', + horizontalAlign: 'right', + markers: { shape: 'circle' }, + labels: { colors: theme.vars.palette.text.primary }, + itemMargin: { horizontal: 8, vertical: 8 }, + }, + + /** ************************************** + * plotOptions + *************************************** */ + plotOptions: { + /** + * bar + * https://apexcharts.com/docs/options/plotoptions/bar/ + */ + bar: { borderRadius: 4, columnWidth: '48%', borderRadiusApplication: 'end' }, + /** + * pie + donut + * https://apexcharts.com/docs/options/plotoptions/pie/ + */ + pie: { + donut: { labels: { show: true, value: { ...LABEL_VALUE }, total: { ...LABEL_TOTAL } } }, + }, + /** + * radialBar + * https://apexcharts.com/docs/options/plotoptions/radialbar/ + */ + radialBar: { + hollow: { margin: -8, size: '100%' }, + track: { + margin: -8, + strokeWidth: '50%', + background: varAlpha(theme.vars.palette.grey['500Channel'], 0.16), + }, + dataLabels: { value: { ...LABEL_VALUE }, total: { ...LABEL_TOTAL } }, + }, + /** + * radar + * https://apexcharts.com/docs/options/plotoptions/radar/ + */ + radar: { + polygons: { + fill: { colors: ['transparent'] }, + strokeColors: theme.vars.palette.divider, + connectorColors: theme.vars.palette.divider, + }, + }, + /** + * polarArea + * https://apexcharts.com/docs/options/plotoptions/polararea/ + */ + polarArea: { + rings: { strokeColor: theme.vars.palette.divider }, + spokes: { connectorColors: theme.vars.palette.divider }, + }, + /** + * heatmap + * https://apexcharts.com/docs/options/plotoptions/heatmap/ + */ + heatmap: { distributed: true }, + }, + + /** ************************************** + * Responsive + * https://apexcharts.com/docs/options/responsive/ + *************************************** */ + responsive: [ + { + breakpoint: theme.breakpoints.values.sm, // sm ~ 600 + options: { plotOptions: { bar: { borderRadius: 3, columnWidth: '80%' } } }, + }, + { + breakpoint: theme.breakpoints.values.md, // md ~ 900 + options: { plotOptions: { bar: { columnWidth: '60%' } } }, + }, + ], + }; +}; diff --git a/src/components/color-utils/classes.ts b/src/components/color-utils/classes.ts new file mode 100644 index 0000000..9bf4bbd --- /dev/null +++ b/src/components/color-utils/classes.ts @@ -0,0 +1,18 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const colorPreviewClasses = { + root: createClasses('color__preview__root'), + item: createClasses('color__preview__item'), + label: createClasses('color__preview__label'), +}; + +export const colorPickerClasses = { + root: createClasses('color__picker__root'), + item: { + root: createClasses('color__picker__item__root'), + container: createClasses('color__picker__item__container'), + icon: createClasses('color__picker__item__icon'), + }, +}; diff --git a/src/components/color-utils/color-picker.tsx b/src/components/color-utils/color-picker.tsx new file mode 100644 index 0000000..2dc3efe --- /dev/null +++ b/src/components/color-utils/color-picker.tsx @@ -0,0 +1,179 @@ +import type { Theme, SxProps } from '@mui/material/styles'; + +import { useCallback } from 'react'; +import { varAlpha, mergeClasses } from 'minimal-shared/utils'; + +import ButtonBase from '@mui/material/ButtonBase'; +import { styled, alpha as hexAlpha } from '@mui/material/styles'; + +import { Iconify } from '../iconify'; +import { colorPickerClasses } from './classes'; + +// ---------------------------------------------------------------------- + +export type ColorPickerSlotProps = { + item?: React.ComponentProps; + itemContainer?: React.ComponentProps; + icon?: React.ComponentProps; +}; + +export type ColorPickerProps = Omit, 'onChange'> & { + sx?: SxProps; + size?: number; + options?: string[]; + limit?: 'auto' | number; + value?: string | string[]; + variant?: 'circular' | 'rounded' | 'square'; + onChange?: (value: string | string[]) => void; + slotProps?: ColorPickerSlotProps; +}; + +export function ColorPicker({ + sx, + value, + onChange, + slotProps, + className, + size = 36, + options = [], + limit = 'auto', + variant = 'circular', + ...other +}: ColorPickerProps) { + const isSingleSelect = typeof value === 'string'; + + const handleSelect = useCallback( + (color: string) => { + if (isSingleSelect) { + if (color !== value) { + onChange?.(color); + } + } else { + const selected = value as string[]; + + const newSelected = selected.includes(color) + ? selected.filter((currentColor) => currentColor !== color) + : [...selected, color]; + + onChange?.(newSelected); + } + }, + [onChange, value, isSingleSelect] + ); + + return ( + + {options.map((color) => { + const hasSelected = isSingleSelect ? value === color : (value as string[]).includes(color); + + return ( +
  • + handleSelect(color)} + className={colorPickerClasses.item.root} + {...slotProps?.item} + > + + + + +
  • + ); + })} +
    + ); +} + +// ---------------------------------------------------------------------- + +const ColorPickerRoot = styled('ul', { + shouldForwardProp: (prop: string) => !['limit', 'sx'].includes(prop), +})>(({ limit }) => ({ + flexWrap: 'wrap', + flexDirection: 'row', + display: 'inline-flex', + '& > li': { display: 'inline-flex' }, + ...(typeof limit === 'number' && { + justifyContent: 'flex-end', + width: `calc(var(--item-size) * ${limit})`, + }), +})); + +const ItemRoot = styled(ButtonBase)(() => ({ + width: 'var(--item-size)', + height: 'var(--item-size)', + borderRadius: 'var(--item-radius)', +})); + +const ItemContainer = styled('span', { + shouldForwardProp: (prop: string) => !['color', 'hasSelected', 'sx'].includes(prop), +})<{ color: string; hasSelected: boolean }>(({ color, theme }) => ({ + alignItems: 'center', + display: 'inline-flex', + borderRadius: 'inherit', + justifyContent: 'center', + backgroundColor: color, + width: 'calc(var(--item-size) - 16px)', + height: 'calc(var(--item-size) - 16px)', + border: `solid 1px ${varAlpha(theme.vars.palette.grey['500Channel'], 0.16)}`, + transition: theme.transitions.create(['all'], { + duration: theme.transitions.duration.shortest, + }), + variants: [ + { + props: { hasSelected: true }, + style: { + width: 'calc(var(--item-size) - 8px)', + height: 'calc(var(--item-size) - 8px)', + outline: `solid 2px ${hexAlpha(color, 0.08)}`, + boxShadow: `4px 4px 8px 0 ${hexAlpha(color, 0.48)}`, + }, + }, + ], +})); + +const ItemIcon = styled(Iconify, { + shouldForwardProp: (prop: string) => !['color', 'hasSelected', 'sx'].includes(prop), +})<{ color: string; hasSelected: boolean }>(({ color, theme }) => ({ + width: 0, + height: 0, + color: theme.palette.getContrastText(color), + transition: theme.transitions.create(['all'], { + duration: theme.transitions.duration.shortest, + }), + variants: [ + { + props: { hasSelected: true }, + style: { + width: 'calc(var(--item-size) / 2.4)', + height: 'calc(var(--item-size) / 2.4)', + }, + }, + ], +})); diff --git a/src/components/color-utils/color-preview.tsx b/src/components/color-utils/color-preview.tsx new file mode 100644 index 0000000..f485ad2 --- /dev/null +++ b/src/components/color-utils/color-preview.tsx @@ -0,0 +1,90 @@ +import { varAlpha, mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { colorPreviewClasses } from './classes'; + +// ---------------------------------------------------------------------- + +export type ColorPreviewSlotProps = { + item?: React.ComponentProps; + label?: React.ComponentProps; +}; + +export type ColorPreviewProps = React.ComponentProps & { + limit?: number; + size?: number; + gap?: number; + colors: string[]; + slotProps?: ColorPreviewSlotProps; +}; + +export function ColorPreview({ + sx, + colors, + className, + slotProps, + gap = 6, + limit = 3, + size = 16, + ...other +}: ColorPreviewProps) { + const colorsRange = colors.slice(0, limit); + const remainingColorCount = colors.length - limit; + + return ( + + {colorsRange.map((color, index) => ( + + ))} + + {colors.length > limit && ( + {`+${remainingColorCount}`} + )} + + ); +} + +// ---------------------------------------------------------------------- + +const ColorPreviewRoot = styled('ul')(() => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', +})); + +const ItemRoot = styled('li')(({ theme }) => ({ + borderRadius: '50%', + width: 'var(--item-size)', + height: 'var(--item-size)', + marginLeft: 'var(--item-gap)', + backgroundColor: 'var(--item-color)', + border: `solid 2px ${theme.vars.palette.background.paper}`, + boxShadow: `inset -1px 1px 2px ${varAlpha(theme.vars.palette.common.blackChannel, 0.24)}`, +})); + +const ItemLabel = styled('li')(({ theme }) => ({ + ...theme.typography.subtitle2, +})); diff --git a/src/components/color-utils/index.ts b/src/components/color-utils/index.ts new file mode 100644 index 0000000..efdd979 --- /dev/null +++ b/src/components/color-utils/index.ts @@ -0,0 +1,5 @@ +export * from './classes'; + +export * from './color-picker'; + +export * from './color-preview'; diff --git a/src/components/iconify/classes.ts b/src/components/iconify/classes.ts new file mode 100644 index 0000000..6d4a463 --- /dev/null +++ b/src/components/iconify/classes.ts @@ -0,0 +1,7 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const iconifyClasses = { + root: createClasses('iconify__root'), +}; diff --git a/src/components/iconify/icon-sets.ts b/src/components/iconify/icon-sets.ts new file mode 100644 index 0000000..586e62c --- /dev/null +++ b/src/components/iconify/icon-sets.ts @@ -0,0 +1,101 @@ +export default { + 'solar:pen-bold': { + body: '', + }, + 'solar:eye-bold': { + body: '', + }, + 'solar:share-bold': { + body: '', + }, + 'solar:cart-3-bold': { + body: '', + }, + 'solar:restart-bold': { + body: '', + }, + 'solar:eye-closed-bold': { + body: '', + }, + 'solar:check-circle-bold': { + body: '', + }, + 'solar:trash-bin-trash-bold': { + body: '', + }, + 'solar:chat-round-dots-bold': { + body: '', + }, + 'solar:clock-circle-outline': { + body: '', + }, + 'solar:bell-bing-bold-duotone': { + body: '', + }, + 'solar:home-angle-bold-duotone': { + body: '', + }, + 'solar:settings-bold-duotone': { + body: '', + }, + 'solar:shield-keyhole-bold-duotone': { + body: '', + }, + 'eva:more-vertical-fill': { + body: '', + }, + 'eva:search-fill': { + body: '', + }, + 'eva:done-all-fill': { + body: '', + }, + 'eva:checkmark-fill': { + body: '', + }, + 'eva:trending-down-fill': { + body: '', + }, + 'eva:trending-up-fill': { + body: '', + }, + 'eva:arrow-ios-forward-fill': { + body: '', + }, + 'eva:arrow-ios-downward-fill': { + body: '', + }, + 'eva:arrow-ios-upward-fill': { + body: '', + }, + 'ic:round-filter-list': { + body: '', + }, + 'mingcute:add-line': { + body: '', + }, + 'mingcute:close-line': { + body: '', + }, + 'carbon:chevron-sort': { + body: '', + }, + 'socials:linkedin': { + body: '', + }, + 'socials:facebook': { + body: '', + }, + 'socials:github': { + body: '', + }, + 'socials:twitter': { + body: '', + }, + 'socials:google': { + body: ' ', + }, + 'custom:menu-duotone': { + body: ' ', + }, +}; diff --git a/src/components/iconify/iconify.tsx b/src/components/iconify/iconify.tsx new file mode 100644 index 0000000..8c18c95 --- /dev/null +++ b/src/components/iconify/iconify.tsx @@ -0,0 +1,58 @@ +import type { IconProps } from '@iconify/react'; + +import { useId } from 'react'; +import { Icon } from '@iconify/react'; +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { iconifyClasses } from './classes'; +import { allIconNames, registerIcons } from './register-icons'; + +import type { IconifyName } from './register-icons'; + +// ---------------------------------------------------------------------- + +export type IconifyProps = React.ComponentProps & + Omit & { + icon: IconifyName; + }; + +export function Iconify({ className, icon, width = 20, height, sx, ...other }: IconifyProps) { + const id = useId(); + + if (!allIconNames.includes(icon)) { + console.warn( + [ + `Icon "${icon}" is currently loaded online, which may cause flickering effects.`, + `To ensure a smoother experience, please register your icon collection for offline use.`, + `More information is available at: https://docs.minimals.cc/icons/`, + ].join('\n') + ); + } + + registerIcons(); + + return ( + + ); +} + +// ---------------------------------------------------------------------- + +const IconRoot = styled(Icon)``; diff --git a/src/components/iconify/index.ts b/src/components/iconify/index.ts new file mode 100644 index 0000000..72937f9 --- /dev/null +++ b/src/components/iconify/index.ts @@ -0,0 +1,5 @@ +export * from './classes'; + +export * from './iconify'; + +export * from './register-icons'; diff --git a/src/components/iconify/register-icons.ts b/src/components/iconify/register-icons.ts new file mode 100644 index 0000000..f00575b --- /dev/null +++ b/src/components/iconify/register-icons.ts @@ -0,0 +1,51 @@ +import type { IconifyJSON } from '@iconify/react'; + +import { addCollection } from '@iconify/react'; + +import allIcons from './icon-sets'; + +// ---------------------------------------------------------------------- + +export const iconSets = Object.entries(allIcons).reduce((acc, [key, value]) => { + const [prefix, iconName] = key.split(':'); + const existingPrefix = acc.find((item) => item.prefix === prefix); + + if (existingPrefix) { + existingPrefix.icons[iconName] = value; + } else { + acc.push({ + prefix, + icons: { + [iconName]: value, + }, + }); + } + + return acc; +}, [] as IconifyJSON[]); + +export const allIconNames = Object.keys(allIcons) as IconifyName[]; + +export type IconifyName = keyof typeof allIcons; + +// ---------------------------------------------------------------------- + +let areIconsRegistered = false; + +export function registerIcons() { + if (areIconsRegistered) { + return; + } + + iconSets.forEach((iconSet) => { + const iconSetConfig = { + ...iconSet, + width: (iconSet.prefix === 'carbon' && 32) || 24, + height: (iconSet.prefix === 'carbon' && 32) || 24, + }; + + addCollection(iconSetConfig); + }); + + areIconsRegistered = true; +} diff --git a/src/components/label/classes.ts b/src/components/label/classes.ts new file mode 100644 index 0000000..0042053 --- /dev/null +++ b/src/components/label/classes.ts @@ -0,0 +1,8 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const labelClasses = { + root: createClasses('label__root'), + icon: createClasses('label__icon'), +}; diff --git a/src/components/label/index.ts b/src/components/label/index.ts new file mode 100644 index 0000000..71f3c7e --- /dev/null +++ b/src/components/label/index.ts @@ -0,0 +1,7 @@ +export * from './label'; + +export * from './styles'; + +export * from './classes'; + +export type * from './types'; diff --git a/src/components/label/label.tsx b/src/components/label/label.tsx new file mode 100644 index 0000000..a2b07d6 --- /dev/null +++ b/src/components/label/label.tsx @@ -0,0 +1,38 @@ +import { upperFirst } from 'es-toolkit'; +import { mergeClasses } from 'minimal-shared/utils'; + +import { labelClasses } from './classes'; +import { LabelRoot, LabelIcon } from './styles'; + +import type { LabelProps } from './types'; + +// ---------------------------------------------------------------------- + +export function Label({ + sx, + endIcon, + children, + startIcon, + className, + disabled, + variant = 'soft', + color = 'default', + ...other +}: LabelProps) { + return ( + + {startIcon && {startIcon}} + + {typeof children === 'string' ? upperFirst(children) : children} + + {endIcon && {endIcon}} + + ); +} diff --git a/src/components/label/styles.tsx b/src/components/label/styles.tsx new file mode 100644 index 0000000..b266699 --- /dev/null +++ b/src/components/label/styles.tsx @@ -0,0 +1,116 @@ +import type { CSSObject } from '@mui/material/styles'; + +import { varAlpha } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import type { LabelProps } from './types'; + +// ---------------------------------------------------------------------- + +export const LabelRoot = styled('span', { + shouldForwardProp: (prop: string) => !['color', 'variant', 'disabled', 'sx'].includes(prop), +})(({ color, variant, disabled, theme }) => { + const defaultStyles: CSSObject = { + ...(color === 'default' && { + /** + * @variant filled + */ + ...(variant === 'filled' && { + color: theme.vars.palette.common.white, + backgroundColor: theme.vars.palette.text.primary, + ...theme.applyStyles('dark', { + color: theme.vars.palette.grey[800], + }), + }), + /** + * @variant outlined + */ + ...(variant === 'outlined' && { + backgroundColor: 'transparent', + color: theme.vars.palette.text.primary, + border: `2px solid ${theme.vars.palette.text.primary}`, + }), + /** + * @variant soft + */ + ...(variant === 'soft' && { + color: theme.vars.palette.text.secondary, + backgroundColor: varAlpha(theme.vars.palette.grey['500Channel'], 0.16), + }), + /** + * @variant inverted + */ + ...(variant === 'inverted' && { + color: theme.vars.palette.grey[800], + backgroundColor: theme.vars.palette.grey[300], + }), + }), + }; + + const colorStyles: CSSObject = { + ...(color && + color !== 'default' && { + /** + * @variant filled + */ + ...(variant === 'filled' && { + color: theme.vars.palette[color].contrastText, + backgroundColor: theme.vars.palette[color].main, + }), + /** + * @variant outlined + */ + ...(variant === 'outlined' && { + backgroundColor: 'transparent', + color: theme.vars.palette[color].main, + border: `2px solid ${theme.vars.palette[color].main}`, + }), + /** + * @variant soft + */ + ...(variant === 'soft' && { + color: theme.vars.palette[color].dark, + backgroundColor: varAlpha(theme.vars.palette[color].mainChannel, 0.16), + ...theme.applyStyles('dark', { + color: theme.vars.palette[color].light, + }), + }), + /** + * @variant inverted + */ + ...(variant === 'inverted' && { + color: theme.vars.palette[color].darker, + backgroundColor: theme.vars.palette[color].lighter, + }), + }), + }; + + return { + height: 24, + minWidth: 24, + lineHeight: 0, + flexShrink: 0, + cursor: 'default', + alignItems: 'center', + whiteSpace: 'nowrap', + display: 'inline-flex', + gap: theme.spacing(0.75), + justifyContent: 'center', + padding: theme.spacing(0, 0.75), + fontSize: theme.typography.pxToRem(12), + fontWeight: theme.typography.fontWeightBold, + borderRadius: theme.shape.borderRadius * 0.75, + transition: theme.transitions.create(['all'], { duration: theme.transitions.duration.shorter }), + ...defaultStyles, + ...colorStyles, + ...(disabled && { opacity: 0.48, pointerEvents: 'none' }), + }; +}); + +export const LabelIcon = styled('span')({ + width: 16, + height: 16, + flexShrink: 0, + '& svg, img': { width: '100%', height: '100%', objectFit: 'cover' }, +}); diff --git a/src/components/label/types.ts b/src/components/label/types.ts new file mode 100644 index 0000000..4db6635 --- /dev/null +++ b/src/components/label/types.ts @@ -0,0 +1,23 @@ +import type { Theme, SxProps } from '@mui/material/styles'; + +// ---------------------------------------------------------------------- + +export type LabelColor = + | 'default' + | 'primary' + | 'secondary' + | 'info' + | 'success' + | 'warning' + | 'error'; + +export type LabelVariant = 'filled' | 'outlined' | 'soft' | 'inverted'; + +export interface LabelProps extends React.ComponentProps<'span'> { + sx?: SxProps; + disabled?: boolean; + color?: LabelColor; + variant?: LabelVariant; + endIcon?: React.ReactNode; + startIcon?: React.ReactNode; +} diff --git a/src/components/logo/classes.ts b/src/components/logo/classes.ts new file mode 100644 index 0000000..3801199 --- /dev/null +++ b/src/components/logo/classes.ts @@ -0,0 +1,7 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const logoClasses = { + root: createClasses('logo__root'), +}; diff --git a/src/components/logo/index.ts b/src/components/logo/index.ts new file mode 100644 index 0000000..b86e7ad --- /dev/null +++ b/src/components/logo/index.ts @@ -0,0 +1,3 @@ +export * from './logo'; + +export * from './classes'; diff --git a/src/components/logo/logo.tsx b/src/components/logo/logo.tsx new file mode 100644 index 0000000..251b63e --- /dev/null +++ b/src/components/logo/logo.tsx @@ -0,0 +1,197 @@ +import type { LinkProps } from '@mui/material/Link'; + +import { useId } from 'react'; +import { mergeClasses } from 'minimal-shared/utils'; + +import Link from '@mui/material/Link'; +import { styled, useTheme } from '@mui/material/styles'; + +import { RouterLink } from 'src/routes/components'; + +import { logoClasses } from './classes'; + +// ---------------------------------------------------------------------- + +export type LogoProps = LinkProps & { + isSingle?: boolean; + disabled?: boolean; +}; + +export function Logo({ + sx, + disabled, + className, + href = '/', + isSingle = true, + ...other +}: LogoProps) { + const theme = useTheme(); + + const gradientId = useId(); + + const TEXT_PRIMARY = theme.vars.palette.text.primary; + const PRIMARY_LIGHT = theme.vars.palette.primary.light; + const PRIMARY_MAIN = theme.vars.palette.primary.main; + const PRIMARY_DARKER = theme.vars.palette.primary.dark; + + const singleLogo = ( + + + + + + + + + + + + + + + + + + + + ); + + const fullLogo = ( + + + + + + + + + + + + + + + + + + + + + ); + + return ( + + {isSingle ? singleLogo : fullLogo} + + ); +} + +// ---------------------------------------------------------------------- + +const LogoRoot = styled(Link)(() => ({ + flexShrink: 0, + color: 'transparent', + display: 'inline-flex', + verticalAlign: 'middle', +})); diff --git a/src/components/scrollbar/classes.ts b/src/components/scrollbar/classes.ts new file mode 100644 index 0000000..8cdeacc --- /dev/null +++ b/src/components/scrollbar/classes.ts @@ -0,0 +1,7 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const scrollbarClasses = { + root: createClasses('scrollbar__root'), +}; diff --git a/src/components/scrollbar/index.ts b/src/components/scrollbar/index.ts new file mode 100644 index 0000000..a483df6 --- /dev/null +++ b/src/components/scrollbar/index.ts @@ -0,0 +1,5 @@ +export * from './classes'; + +export * from './scrollbar'; + +export type * from './types'; diff --git a/src/components/scrollbar/scrollbar.tsx b/src/components/scrollbar/scrollbar.tsx new file mode 100644 index 0000000..74c4ca3 --- /dev/null +++ b/src/components/scrollbar/scrollbar.tsx @@ -0,0 +1,60 @@ +import SimpleBar from 'simplebar-react'; +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { scrollbarClasses } from './classes'; + +import type { ScrollbarProps } from './types'; + +// ---------------------------------------------------------------------- + +export function Scrollbar({ + sx, + ref, + children, + className, + slotProps, + fillContent = true, + ...other +}: ScrollbarProps) { + return ( + + {children} + + ); +} + +// ---------------------------------------------------------------------- + +const ScrollbarRoot = styled(SimpleBar, { + shouldForwardProp: (prop: string) => !['fillContent', 'sx'].includes(prop), +})>(({ fillContent }) => ({ + minWidth: 0, + minHeight: 0, + flexGrow: 1, + display: 'flex', + flexDirection: 'column', + ...(fillContent && { + '& .simplebar-content': { + display: 'flex', + flex: '1 1 auto', + minHeight: '100%', + flexDirection: 'column', + }, + }), +})); diff --git a/src/components/scrollbar/styles.css b/src/components/scrollbar/styles.css new file mode 100644 index 0000000..2fbf4d9 --- /dev/null +++ b/src/components/scrollbar/styles.css @@ -0,0 +1,8 @@ +@import 'simplebar-react/dist/simplebar.min.css'; + +.simplebar-scrollbar:before { + background-color: var(--palette-text-disabled); +} +.simplebar-scrollbar.simplebar-visible:before { + opacity: 0.48; +} diff --git a/src/components/scrollbar/types.ts b/src/components/scrollbar/types.ts new file mode 100644 index 0000000..c53cbb9 --- /dev/null +++ b/src/components/scrollbar/types.ts @@ -0,0 +1,15 @@ +import type { Theme, SxProps } from '@mui/material/styles'; +import type { Props as SimplebarProps } from 'simplebar-react'; + +// ---------------------------------------------------------------------- + +export type ScrollbarProps = SimplebarProps & + React.ComponentProps<'div'> & { + sx?: SxProps; + fillContent?: boolean; + slotProps?: { + wrapperSx?: SxProps; + contentSx?: SxProps; + contentWrapperSx?: SxProps; + }; + }; diff --git a/src/components/svg-color/classes.ts b/src/components/svg-color/classes.ts new file mode 100644 index 0000000..319b076 --- /dev/null +++ b/src/components/svg-color/classes.ts @@ -0,0 +1,7 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const svgColorClasses = { + root: createClasses('svg__color__root'), +}; diff --git a/src/components/svg-color/index.ts b/src/components/svg-color/index.ts new file mode 100644 index 0000000..372c31d --- /dev/null +++ b/src/components/svg-color/index.ts @@ -0,0 +1,5 @@ +export * from './classes'; + +export * from './svg-color'; + +export type * from './types'; diff --git a/src/components/svg-color/svg-color.tsx b/src/components/svg-color/svg-color.tsx new file mode 100644 index 0000000..023ab8a --- /dev/null +++ b/src/components/svg-color/svg-color.tsx @@ -0,0 +1,35 @@ +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { svgColorClasses } from './classes'; + +import type { SvgColorProps } from './types'; + +// ---------------------------------------------------------------------- + +export function SvgColor({ src, className, sx, ...other }: SvgColorProps) { + return ( + + ); +} + +// ---------------------------------------------------------------------- + +const SvgRoot = styled('span')(() => ({ + width: 24, + height: 24, + flexShrink: 0, + display: 'inline-flex', + backgroundColor: 'currentColor', +})); diff --git a/src/components/svg-color/types.ts b/src/components/svg-color/types.ts new file mode 100644 index 0000000..c790c87 --- /dev/null +++ b/src/components/svg-color/types.ts @@ -0,0 +1,8 @@ +import type { Theme, SxProps } from '@mui/material/styles'; + +// ---------------------------------------------------------------------- + +export type SvgColorProps = React.ComponentProps<'span'> & { + src: string; + sx?: SxProps; +}; diff --git a/src/config-global.ts b/src/config-global.ts new file mode 100644 index 0000000..067d7e4 --- /dev/null +++ b/src/config-global.ts @@ -0,0 +1,13 @@ +import packageJson from '../package.json'; + +// ---------------------------------------------------------------------- + +export type ConfigValue = { + appName: string; + appVersion: string; +}; + +export const CONFIG: ConfigValue = { + appName: 'Minimal UI', + appVersion: packageJson.version, +}; diff --git a/src/global.css b/src/global.css new file mode 100644 index 0000000..8bd8f44 --- /dev/null +++ b/src/global.css @@ -0,0 +1,56 @@ +/** ************************************** +* Fonts: app +*************************************** */ +@import '@fontsource-variable/dm-sans'; + +@import '@fontsource/barlow/400.css'; +@import '@fontsource/barlow/500.css'; +@import '@fontsource/barlow/600.css'; +@import '@fontsource/barlow/700.css'; +@import '@fontsource/barlow/800.css'; + +/** ************************************** +* Plugins +*************************************** */ +/* scrollbar */ +@import './components/scrollbar/styles.css'; + +/* chart */ +@import './components/chart/styles.css'; + +/** ************************************** +* Baseline +*************************************** */ +html { + height: 100%; + -webkit-overflow-scrolling: touch; +} +body, +#root, +#root__layout { + display: flex; + flex: 1 1 auto; + min-height: 100%; + flex-direction: column; +} +img { + max-width: 100%; + vertical-align: middle; +} +ul { + margin: 0; + padding: 0; + list-style-type: none; +} +input[type='number'] { + -moz-appearance: textfield; + appearance: none; +} +input[type='number']::-webkit-outer-spin-button { + margin: 0; + -webkit-appearance: none; +} +input[type='number']::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; +} diff --git a/src/layouts/auth/content.tsx b/src/layouts/auth/content.tsx new file mode 100644 index 0000000..dafddef --- /dev/null +++ b/src/layouts/auth/content.tsx @@ -0,0 +1,36 @@ +import type { BoxProps } from '@mui/material/Box'; + +import { mergeClasses } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; + +import { layoutClasses } from '../core/classes'; + +// ---------------------------------------------------------------------- + +export type AuthContentProps = BoxProps; + +export function AuthContent({ sx, children, className, ...other }: AuthContentProps) { + return ( + ({ + py: 5, + px: 3, + width: 1, + zIndex: 2, + borderRadius: 2, + display: 'flex', + flexDirection: 'column', + maxWidth: 'var(--layout-auth-content-width)', + bgcolor: theme.vars.palette.background.default, + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + {children} + + ); +} diff --git a/src/layouts/auth/index.ts b/src/layouts/auth/index.ts new file mode 100644 index 0000000..fa1aa0e --- /dev/null +++ b/src/layouts/auth/index.ts @@ -0,0 +1,3 @@ +export * from './layout'; + +export * from './content'; diff --git a/src/layouts/auth/layout.tsx b/src/layouts/auth/layout.tsx new file mode 100644 index 0000000..d73d717 --- /dev/null +++ b/src/layouts/auth/layout.tsx @@ -0,0 +1,148 @@ +import type { CSSObject, Breakpoint } from '@mui/material/styles'; + +import { merge } from 'es-toolkit'; + +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Alert from '@mui/material/Alert'; + +import { RouterLink } from 'src/routes/components'; + +import { Logo } from 'src/components/logo'; + +import { AuthContent } from './content'; +import { MainSection } from '../core/main-section'; +import { LayoutSection } from '../core/layout-section'; +import { HeaderSection } from '../core/header-section'; + +import type { AuthContentProps } from './content'; +import type { MainSectionProps } from '../core/main-section'; +import type { HeaderSectionProps } from '../core/header-section'; +import type { LayoutSectionProps } from '../core/layout-section'; + +// ---------------------------------------------------------------------- + +type LayoutBaseProps = Pick; + +export type AuthLayoutProps = LayoutBaseProps & { + layoutQuery?: Breakpoint; + slotProps?: { + header?: HeaderSectionProps; + main?: MainSectionProps; + content?: AuthContentProps; + }; +}; + +export function AuthLayout({ + sx, + cssVars, + children, + slotProps, + layoutQuery = 'md', +}: AuthLayoutProps) { + const renderHeader = () => { + const headerSlotProps: HeaderSectionProps['slotProps'] = { container: { maxWidth: false } }; + + const headerSlots: HeaderSectionProps['slots'] = { + topArea: ( + + This is an info Alert. + + ), + leftArea: ( + <> + {/** @slot Logo */} + + + ), + rightArea: ( + + {/** @slot Help link */} + + Need help? + + + ), + }; + + return ( + + ); + }; + + const renderFooter = () => null; + + const renderMain = () => ( + ({ + alignItems: 'center', + p: theme.spacing(3, 2, 10, 2), + [theme.breakpoints.up(layoutQuery)]: { + justifyContent: 'center', + p: theme.spacing(10, 0, 10, 0), + }, + }), + ...(Array.isArray(slotProps?.main?.sx) + ? (slotProps?.main?.sx ?? []) + : [slotProps?.main?.sx]), + ]} + > + {children} + + ); + + return ( + ({ + position: 'relative', + '&::before': backgroundStyles(), + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + > + {renderMain()} + + ); +} + +// ---------------------------------------------------------------------- + +const backgroundStyles = (): CSSObject => ({ + zIndex: 1, + opacity: 0.24, + width: '100%', + height: '100%', + content: "''", + position: 'absolute', + backgroundSize: 'cover', + backgroundRepeat: 'no-repeat', + backgroundPosition: 'center center', + backgroundImage: 'url(/assets/background/overlay.jpg)', +}); diff --git a/src/layouts/components/account-popover.tsx b/src/layouts/components/account-popover.tsx new file mode 100644 index 0000000..995efce --- /dev/null +++ b/src/layouts/components/account-popover.tsx @@ -0,0 +1,139 @@ +import type { IconButtonProps } from '@mui/material/IconButton'; + +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Avatar from '@mui/material/Avatar'; +import Popover from '@mui/material/Popover'; +import Divider from '@mui/material/Divider'; +import MenuList from '@mui/material/MenuList'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { useRouter, usePathname } from 'src/routes/hooks'; + +import { _myAccount } from 'src/_mock'; + +// ---------------------------------------------------------------------- + +export type AccountPopoverProps = IconButtonProps & { + data?: { + label: string; + href: string; + icon?: React.ReactNode; + info?: React.ReactNode; + }[]; +}; + +export function AccountPopover({ data = [], sx, ...other }: AccountPopoverProps) { + const router = useRouter(); + + const pathname = usePathname(); + + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + const handleClickItem = useCallback( + (path: string) => { + handleClosePopover(); + router.push(path); + }, + [handleClosePopover, router] + ); + + return ( + <> + + `conic-gradient(${theme.vars.palette.primary.light}, ${theme.vars.palette.warning.light}, ${theme.vars.palette.primary.light})`, + ...sx, + }} + {...other} + > + + {_myAccount.displayName.charAt(0).toUpperCase()} + + + + + + + {_myAccount?.displayName} + + + + {_myAccount?.email} + + + + + + + {data.map((option) => ( + handleClickItem(option.href)} + > + {option.icon} + {option.label} + + ))} + + + + + + + + + + ); +} diff --git a/src/layouts/components/language-popover.tsx b/src/layouts/components/language-popover.tsx new file mode 100644 index 0000000..1829e8b --- /dev/null +++ b/src/layouts/components/language-popover.tsx @@ -0,0 +1,109 @@ +import type { IconButtonProps } from '@mui/material/IconButton'; + +import { useState, useCallback } from 'react'; +import { usePopover } from 'minimal-shared/hooks'; + +import Box from '@mui/material/Box'; +import Popover from '@mui/material/Popover'; +import MenuList from '@mui/material/MenuList'; +import IconButton from '@mui/material/IconButton'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +// ---------------------------------------------------------------------- + +export type LanguagePopoverProps = IconButtonProps & { + data?: { + value: string; + label: string; + icon: string; + }[]; +}; + +export function LanguagePopover({ data = [], sx, ...other }: LanguagePopoverProps) { + const { open, anchorEl, onClose, onOpen } = usePopover(); + + const [locale, setLocale] = useState(data[0].value); + + const handleChangeLang = useCallback( + (newLang: string) => { + setLocale(newLang); + onClose(); + }, + [onClose] + ); + + const currentLang = data.find((lang) => lang.value === locale); + + const renderFlag = (label?: string, icon?: string) => ( + + ); + + const renderMenuList = () => ( + + + {data?.map((option) => ( + handleChangeLang(option.value)} + > + {renderFlag(option.label, option.icon)} + {option.label} + + ))} + + + ); + + return ( + <> + ({ + p: 0, + width: 40, + height: 40, + ...(open && { bgcolor: theme.vars.palette.action.selected }), + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + {renderFlag(currentLang?.label, currentLang?.icon)} + + + {renderMenuList()} + + ); +} diff --git a/src/layouts/components/menu-button.tsx b/src/layouts/components/menu-button.tsx new file mode 100644 index 0000000..c1f226b --- /dev/null +++ b/src/layouts/components/menu-button.tsx @@ -0,0 +1,15 @@ +import type { IconButtonProps } from '@mui/material/IconButton'; + +import IconButton from '@mui/material/IconButton'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +export function MenuButton({ sx, ...other }: IconButtonProps) { + return ( + + + + ); +} diff --git a/src/layouts/components/nav-upgrade.tsx b/src/layouts/components/nav-upgrade.tsx new file mode 100644 index 0000000..92861aa --- /dev/null +++ b/src/layouts/components/nav-upgrade.tsx @@ -0,0 +1,64 @@ +import type { StackProps } from '@mui/material/Stack'; + +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; + +// ---------------------------------------------------------------------- + +export function NavUpgrade({ sx, ...other }: StackProps) { + return ( + + ({ + background: `linear-gradient(to right, ${theme.vars.palette.secondary.main}, ${theme.vars.palette.warning.main})`, + WebkitBackgroundClip: 'text', + WebkitTextFillColor: 'transparent', + backgroundClip: 'text', + textFillColor: 'transparent', + color: 'transparent', + }), + ]} + > + More features? + + + + {`From only `} + + $69 + + + + + + + + ); +} diff --git a/src/layouts/components/notifications-popover.tsx b/src/layouts/components/notifications-popover.tsx new file mode 100644 index 0000000..3a70318 --- /dev/null +++ b/src/layouts/components/notifications-popover.tsx @@ -0,0 +1,259 @@ +import type { IconButtonProps } from '@mui/material/IconButton'; + +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import List from '@mui/material/List'; +import Badge from '@mui/material/Badge'; +import Button from '@mui/material/Button'; +import Avatar from '@mui/material/Avatar'; +import Divider from '@mui/material/Divider'; +import Tooltip from '@mui/material/Tooltip'; +import Popover from '@mui/material/Popover'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import ListItemText from '@mui/material/ListItemText'; +import ListSubheader from '@mui/material/ListSubheader'; +import ListItemAvatar from '@mui/material/ListItemAvatar'; +import ListItemButton from '@mui/material/ListItemButton'; + +import { fToNow } from 'src/utils/format-time'; + +import { Iconify } from 'src/components/iconify'; +import { Scrollbar } from 'src/components/scrollbar'; + +// ---------------------------------------------------------------------- + +type NotificationItemProps = { + id: string; + type: string; + title: string; + isUnRead: boolean; + description: string; + avatarUrl: string | null; + postedAt: string | number | null; +}; + +export type NotificationsPopoverProps = IconButtonProps & { + data?: NotificationItemProps[]; +}; + +export function NotificationsPopover({ data = [], sx, ...other }: NotificationsPopoverProps) { + const [notifications, setNotifications] = useState(data); + + const totalUnRead = notifications.filter((item) => item.isUnRead === true).length; + + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + const handleMarkAllAsRead = useCallback(() => { + const updatedNotifications = notifications.map((notification) => ({ + ...notification, + isUnRead: false, + })); + + setNotifications(updatedNotifications); + }, [notifications]); + + return ( + <> + + + + + + + + + + Notifications + + You have {totalUnRead} unread messages + + + + {totalUnRead > 0 && ( + + + + + + )} + + + + + + + New + + } + > + {notifications.slice(0, 2).map((notification) => ( + + ))} + + + + Before that + + } + > + {notifications.slice(2, 5).map((notification) => ( + + ))} + + + + + + + + + + + ); +} + +// ---------------------------------------------------------------------- + +function NotificationItem({ notification }: { notification: NotificationItemProps }) { + const { avatarUrl, title } = renderContent(notification); + + return ( + + + {avatarUrl} + + + + {fToNow(notification.postedAt)} + + } + /> + + ); +} + +// ---------------------------------------------------------------------- + +function renderContent(notification: NotificationItemProps) { + const title = ( + + {notification.title} + +   {notification.description} + + + ); + + if (notification.type === 'order-placed') { + return { + avatarUrl: ( + {notification.title} + ), + title, + }; + } + if (notification.type === 'order-shipped') { + return { + avatarUrl: ( + {notification.title} + ), + title, + }; + } + if (notification.type === 'mail') { + return { + avatarUrl: ( + {notification.title} + ), + title, + }; + } + if (notification.type === 'chat-message') { + return { + avatarUrl: ( + {notification.title} + ), + title, + }; + } + return { + avatarUrl: notification.avatarUrl ? ( + {notification.title} + ) : null, + title, + }; +} diff --git a/src/layouts/components/searchbar.tsx b/src/layouts/components/searchbar.tsx new file mode 100644 index 0000000..31ac203 --- /dev/null +++ b/src/layouts/components/searchbar.tsx @@ -0,0 +1,84 @@ +import type { BoxProps } from '@mui/material/Box'; + +import { useState, useCallback } from 'react'; +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Slide from '@mui/material/Slide'; +import Input from '@mui/material/Input'; +import Button from '@mui/material/Button'; +import { useTheme } from '@mui/material/styles'; +import IconButton from '@mui/material/IconButton'; +import InputAdornment from '@mui/material/InputAdornment'; +import ClickAwayListener from '@mui/material/ClickAwayListener'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +export function Searchbar({ sx, ...other }: BoxProps) { + const theme = useTheme(); + + const [open, setOpen] = useState(false); + + const handleOpen = useCallback(() => { + setOpen((prev) => !prev); + }, []); + + const handleClose = useCallback(() => { + setOpen(false); + }, []); + + return ( + +
    + {!open && ( + + + + )} + + + + + + + } + sx={{ fontWeight: 'fontWeightBold' }} + /> + + + +
    +
    + ); +} diff --git a/src/layouts/components/workspaces-popover.tsx b/src/layouts/components/workspaces-popover.tsx new file mode 100644 index 0000000..56b473c --- /dev/null +++ b/src/layouts/components/workspaces-popover.tsx @@ -0,0 +1,132 @@ +import type { ButtonBaseProps } from '@mui/material/ButtonBase'; + +import { useState, useCallback } from 'react'; +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Popover from '@mui/material/Popover'; +import MenuList from '@mui/material/MenuList'; +import ButtonBase from '@mui/material/ButtonBase'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { Label } from 'src/components/label'; +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +export type WorkspacesPopoverProps = ButtonBaseProps & { + data?: { + id: string; + name: string; + logo: string; + plan: string; + }[]; +}; + +export function WorkspacesPopover({ data = [], sx, ...other }: WorkspacesPopoverProps) { + const [workspace, setWorkspace] = useState(data[0]); + + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + const handleChangeWorkspace = useCallback( + (newValue: (typeof data)[number]) => { + setWorkspace(newValue); + handleClosePopover(); + }, + [handleClosePopover] + ); + + const renderAvatar = (alt: string, src: string) => ( + + ); + + const renderLabel = (plan: string) => ( + + ); + + return ( + <> + varAlpha(theme.vars.palette.grey['500Channel'], 0.08), + ...sx, + }} + {...other} + > + {renderAvatar(workspace?.name, workspace?.logo)} + + + {workspace?.name} + {renderLabel(workspace?.plan)} + + + + + + + + {data.map((option) => ( + handleChangeWorkspace(option)} + > + {renderAvatar(option.name, option.logo)} + + + {option.name} + + + {renderLabel(option.plan)} + + ))} + + + + ); +} diff --git a/src/layouts/core/classes.ts b/src/layouts/core/classes.ts new file mode 100644 index 0000000..7058c09 --- /dev/null +++ b/src/layouts/core/classes.ts @@ -0,0 +1,17 @@ +import { createClasses } from 'src/theme/create-classes'; + +// ---------------------------------------------------------------------- + +export const layoutClasses = { + root: createClasses('layout__root'), + main: createClasses('layout__main'), + header: createClasses('layout__header'), + nav: { + root: createClasses('layout__nav__root'), + mobile: createClasses('layout__nav__mobile'), + vertical: createClasses('layout__nav__vertical'), + horizontal: createClasses('layout__nav__horizontal'), + }, + content: createClasses('layout__main__content'), + sidebarContainer: createClasses('layout__sidebar__container'), +}; diff --git a/src/layouts/core/css-vars.ts b/src/layouts/core/css-vars.ts new file mode 100644 index 0000000..2edd9c5 --- /dev/null +++ b/src/layouts/core/css-vars.ts @@ -0,0 +1,14 @@ +import type { Theme } from '@mui/material/styles'; + +// ---------------------------------------------------------------------- + +export function layoutSectionVars(theme: Theme) { + return { + '--layout-nav-zIndex': theme.zIndex.drawer + 1, + '--layout-nav-mobile-width': '288px', + '--layout-header-blur': '8px', + '--layout-header-zIndex': theme.zIndex.appBar + 1, + '--layout-header-mobile-height': '64px', + '--layout-header-desktop-height': '72px', + }; +} diff --git a/src/layouts/core/header-section.tsx b/src/layouts/core/header-section.tsx new file mode 100644 index 0000000..336f00f --- /dev/null +++ b/src/layouts/core/header-section.tsx @@ -0,0 +1,153 @@ +import type { AppBarProps } from '@mui/material/AppBar'; +import type { ContainerProps } from '@mui/material/Container'; +import type { Theme, SxProps, CSSObject, Breakpoint } from '@mui/material/styles'; + +import { useScrollOffsetTop } from 'minimal-shared/hooks'; +import { varAlpha, mergeClasses } from 'minimal-shared/utils'; + +import AppBar from '@mui/material/AppBar'; +import { styled } from '@mui/material/styles'; +import Container from '@mui/material/Container'; + +import { layoutClasses } from './classes'; + +// ---------------------------------------------------------------------- + +export type HeaderSectionProps = AppBarProps & { + layoutQuery?: Breakpoint; + disableOffset?: boolean; + disableElevation?: boolean; + slots?: { + leftArea?: React.ReactNode; + rightArea?: React.ReactNode; + topArea?: React.ReactNode; + centerArea?: React.ReactNode; + bottomArea?: React.ReactNode; + }; + slotProps?: { + container?: ContainerProps; + centerArea?: React.ComponentProps<'div'> & { sx?: SxProps }; + }; +}; + +export function HeaderSection({ + sx, + slots, + slotProps, + className, + disableOffset, + disableElevation, + layoutQuery = 'md', + ...other +}: HeaderSectionProps) { + const { offsetTop: isOffset } = useScrollOffsetTop(); + + return ( + ({ + ...(isOffset && { + '--color': `var(--offset-color, ${theme.vars.palette.text.primary})`, + }), + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + {slots?.topArea} + + + {slots?.leftArea} + + {slots?.centerArea} + + {slots?.rightArea} + + + {slots?.bottomArea} + + ); +} + +// ---------------------------------------------------------------------- + +type HeaderRootProps = Pick & { + isOffset: boolean; +}; + +const HeaderRoot = styled(AppBar, { + shouldForwardProp: (prop: string) => + !['isOffset', 'disableOffset', 'disableElevation', 'sx'].includes(prop), +})(({ isOffset, disableOffset, disableElevation, theme }) => { + const pauseZindex = { top: -1, bottom: -2 }; + + const pauseStyles: CSSObject = { + opacity: 0, + content: '""', + visibility: 'hidden', + position: 'absolute', + transition: theme.transitions.create(['opacity', 'visibility'], { + easing: theme.transitions.easing.easeInOut, + duration: theme.transitions.duration.shorter, + }), + }; + + const bgStyles: CSSObject = { + ...pauseStyles, + top: 0, + left: 0, + width: '100%', + height: '100%', + zIndex: pauseZindex.top, + backdropFilter: `blur(6px)`, + WebkitBackdropFilter: `blur(6px)`, + backgroundColor: varAlpha(theme.vars.palette.background.defaultChannel, 0.8), + ...(isOffset && { + opacity: 1, + visibility: 'visible', + }), + }; + + const shadowStyles: CSSObject = { + ...pauseStyles, + left: 0, + right: 0, + bottom: 0, + height: 24, + margin: 'auto', + borderRadius: '50%', + width: `calc(100% - 48px)`, + zIndex: pauseZindex.bottom, + boxShadow: theme.vars.customShadows.z8, + ...(isOffset && { opacity: 0.48, visibility: 'visible' }), + }; + + return { + boxShadow: 'none', + zIndex: 'var(--layout-header-zIndex)', + ...(!disableOffset && { '&::before': bgStyles }), + ...(!disableElevation && { '&::after': shadowStyles }), + }; +}); + +const HeaderContainer = styled(Container, { + shouldForwardProp: (prop: string) => !['layoutQuery', 'sx'].includes(prop), +})>(({ layoutQuery = 'md', theme }) => ({ + display: 'flex', + alignItems: 'center', + color: 'var(--color)', + height: 'var(--layout-header-mobile-height)', + [theme.breakpoints.up(layoutQuery)]: { height: 'var(--layout-header-desktop-height)' }, +})); + +const HeaderCenterArea = styled('div')(() => ({ + display: 'flex', + flex: '1 1 auto', + justifyContent: 'center', +})); diff --git a/src/layouts/core/index.ts b/src/layouts/core/index.ts new file mode 100644 index 0000000..c68992f --- /dev/null +++ b/src/layouts/core/index.ts @@ -0,0 +1,9 @@ +export * from './classes'; + +export * from './css-vars'; + +export * from './main-section'; + +export * from './layout-section'; + +export * from './header-section'; diff --git a/src/layouts/core/layout-section.tsx b/src/layouts/core/layout-section.tsx new file mode 100644 index 0000000..1789aa2 --- /dev/null +++ b/src/layouts/core/layout-section.tsx @@ -0,0 +1,75 @@ +import type { Theme, SxProps, CSSObject } from '@mui/material/styles'; + +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; +import GlobalStyles from '@mui/material/GlobalStyles'; + +import { layoutClasses } from './classes'; +import { layoutSectionVars } from './css-vars'; + +// ---------------------------------------------------------------------- + +export type LayoutSectionProps = React.ComponentProps<'div'> & { + sx?: SxProps; + cssVars?: CSSObject; + children?: React.ReactNode; + footerSection?: React.ReactNode; + headerSection?: React.ReactNode; + sidebarSection?: React.ReactNode; +}; + +export function LayoutSection({ + sx, + cssVars, + children, + footerSection, + headerSection, + sidebarSection, + className, + ...other +}: LayoutSectionProps) { + const inputGlobalStyles = ( + ({ body: { ...layoutSectionVars(theme), ...cssVars } })} /> + ); + + return ( + <> + {inputGlobalStyles} + + + {sidebarSection ? ( + <> + {sidebarSection} + + {headerSection} + {children} + {footerSection} + + + ) : ( + <> + {headerSection} + {children} + {footerSection} + + )} + + + ); +} + +// ---------------------------------------------------------------------- + +const LayoutRoot = styled('div')``; + +const LayoutSidebarContainer = styled('div')(() => ({ + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', +})); diff --git a/src/layouts/core/main-section.tsx b/src/layouts/core/main-section.tsx new file mode 100644 index 0000000..1ac05c7 --- /dev/null +++ b/src/layouts/core/main-section.tsx @@ -0,0 +1,25 @@ +import { mergeClasses } from 'minimal-shared/utils'; + +import { styled } from '@mui/material/styles'; + +import { layoutClasses } from './classes'; + +// ---------------------------------------------------------------------- + +export type MainSectionProps = React.ComponentProps; + +export function MainSection({ children, className, sx, ...other }: MainSectionProps) { + return ( + + {children} + + ); +} + +// ---------------------------------------------------------------------- + +const MainRoot = styled('main')({ + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', +}); diff --git a/src/layouts/dashboard/content.tsx b/src/layouts/dashboard/content.tsx new file mode 100644 index 0000000..b007718 --- /dev/null +++ b/src/layouts/dashboard/content.tsx @@ -0,0 +1,57 @@ +import type { Breakpoint } from '@mui/material/styles'; +import type { ContainerProps } from '@mui/material/Container'; + +import { mergeClasses } from 'minimal-shared/utils'; + +import Container from '@mui/material/Container'; + +import { layoutClasses } from '../core/classes'; + +// ---------------------------------------------------------------------- + +export type DashboardContentProps = ContainerProps & { + layoutQuery?: Breakpoint; + disablePadding?: boolean; +}; + +export function DashboardContent({ + sx, + children, + className, + disablePadding, + maxWidth = 'lg', + layoutQuery = 'lg', + ...other +}: DashboardContentProps) { + return ( + ({ + display: 'flex', + flex: '1 1 auto', + flexDirection: 'column', + pt: 'var(--layout-dashboard-content-pt)', + pb: 'var(--layout-dashboard-content-pb)', + [theme.breakpoints.up(layoutQuery)]: { + px: 'var(--layout-dashboard-content-px)', + }, + ...(disablePadding && { + p: { + xs: 0, + sm: 0, + md: 0, + lg: 0, + xl: 0, + }, + }), + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + {children} + + ); +} diff --git a/src/layouts/dashboard/css-vars.ts b/src/layouts/dashboard/css-vars.ts new file mode 100644 index 0000000..d9220af --- /dev/null +++ b/src/layouts/dashboard/css-vars.ts @@ -0,0 +1,14 @@ +import type { Theme } from '@mui/material/styles'; + +// ---------------------------------------------------------------------- + +export function dashboardLayoutVars(theme: Theme) { + return { + '--layout-transition-easing': 'linear', + '--layout-transition-duration': '120ms', + '--layout-nav-vertical-width': '300px', + '--layout-dashboard-content-pt': theme.spacing(1), + '--layout-dashboard-content-pb': theme.spacing(8), + '--layout-dashboard-content-px': theme.spacing(5), + }; +} diff --git a/src/layouts/dashboard/index.ts b/src/layouts/dashboard/index.ts new file mode 100644 index 0000000..fa1aa0e --- /dev/null +++ b/src/layouts/dashboard/index.ts @@ -0,0 +1,3 @@ +export * from './layout'; + +export * from './content'; diff --git a/src/layouts/dashboard/layout.tsx b/src/layouts/dashboard/layout.tsx new file mode 100644 index 0000000..3002b83 --- /dev/null +++ b/src/layouts/dashboard/layout.tsx @@ -0,0 +1,148 @@ +import type { Breakpoint } from '@mui/material/styles'; + +import { merge } from 'es-toolkit'; +import { useBoolean } from 'minimal-shared/hooks'; + +import Box from '@mui/material/Box'; +import Alert from '@mui/material/Alert'; +import { useTheme } from '@mui/material/styles'; + +import { _langs, _notifications } from 'src/_mock'; + +import { NavMobile, NavDesktop } from './nav'; +import { layoutClasses } from '../core/classes'; +import { _account } from '../nav-config-account'; +import { dashboardLayoutVars } from './css-vars'; +import { navData } from '../nav-config-dashboard'; +import { MainSection } from '../core/main-section'; +import { Searchbar } from '../components/searchbar'; +import { _workspaces } from '../nav-config-workspace'; +import { MenuButton } from '../components/menu-button'; +import { HeaderSection } from '../core/header-section'; +import { LayoutSection } from '../core/layout-section'; +import { AccountPopover } from '../components/account-popover'; +import { LanguagePopover } from '../components/language-popover'; +import { NotificationsPopover } from '../components/notifications-popover'; + +import type { MainSectionProps } from '../core/main-section'; +import type { HeaderSectionProps } from '../core/header-section'; +import type { LayoutSectionProps } from '../core/layout-section'; + +// ---------------------------------------------------------------------- + +type LayoutBaseProps = Pick; + +export type DashboardLayoutProps = LayoutBaseProps & { + layoutQuery?: Breakpoint; + slotProps?: { + header?: HeaderSectionProps; + main?: MainSectionProps; + }; +}; + +export function DashboardLayout({ + sx, + cssVars, + children, + slotProps, + layoutQuery = 'lg', +}: DashboardLayoutProps) { + const theme = useTheme(); + + const { value: open, onFalse: onClose, onTrue: onOpen } = useBoolean(); + + const renderHeader = () => { + const headerSlotProps: HeaderSectionProps['slotProps'] = { + container: { + maxWidth: false, + }, + }; + + const headerSlots: HeaderSectionProps['slots'] = { + topArea: ( + + This is an info Alert. + + ), + leftArea: ( + <> + {/** @slot Nav mobile */} + + + + ), + rightArea: ( + + {/** @slot Searchbar */} + + + {/** @slot Language popover */} + + + {/** @slot Notifications popover */} + + + {/** @slot Account drawer */} + + + ), + }; + + return ( + + ); + }; + + const renderFooter = () => null; + + const renderMain = () => {children}; + + return ( + + } + /** ************************************** + * @Footer + *************************************** */ + footerSection={renderFooter()} + /** ************************************** + * @Styles + *************************************** */ + cssVars={{ ...dashboardLayoutVars(theme), ...cssVars }} + sx={[ + { + [`& .${layoutClasses.sidebarContainer}`]: { + [theme.breakpoints.up(layoutQuery)]: { + pl: 'var(--layout-nav-vertical-width)', + transition: theme.transitions.create(['padding-left'], { + easing: 'var(--layout-transition-easing)', + duration: 'var(--layout-transition-duration)', + }), + }, + }, + }, + ...(Array.isArray(sx) ? sx : [sx]), + ]} + > + {renderMain()} + + ); +} diff --git a/src/layouts/dashboard/nav.tsx b/src/layouts/dashboard/nav.tsx new file mode 100644 index 0000000..f46007d --- /dev/null +++ b/src/layouts/dashboard/nav.tsx @@ -0,0 +1,194 @@ +import type { Theme, SxProps, Breakpoint } from '@mui/material/styles'; + +import { useEffect } from 'react'; +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import ListItem from '@mui/material/ListItem'; +import { useTheme } from '@mui/material/styles'; +import ListItemButton from '@mui/material/ListItemButton'; +import Drawer, { drawerClasses } from '@mui/material/Drawer'; + +import { usePathname } from 'src/routes/hooks'; +import { RouterLink } from 'src/routes/components'; + +import { Logo } from 'src/components/logo'; +import { Scrollbar } from 'src/components/scrollbar'; + +import { NavUpgrade } from '../components/nav-upgrade'; +import { WorkspacesPopover } from '../components/workspaces-popover'; + +import type { NavItem } from '../nav-config-dashboard'; +import type { WorkspacesPopoverProps } from '../components/workspaces-popover'; + +// ---------------------------------------------------------------------- + +export type NavContentProps = { + data: NavItem[]; + slots?: { + topArea?: React.ReactNode; + bottomArea?: React.ReactNode; + }; + workspaces: WorkspacesPopoverProps['data']; + sx?: SxProps; +}; + +export function NavDesktop({ + sx, + data, + slots, + workspaces, + layoutQuery, +}: NavContentProps & { layoutQuery: Breakpoint }) { + const theme = useTheme(); + + return ( + + + + ); +} + +// ---------------------------------------------------------------------- + +export function NavMobile({ + sx, + data, + open, + slots, + onClose, + workspaces, +}: NavContentProps & { open: boolean; onClose: () => void }) { + const pathname = usePathname(); + + useEffect(() => { + if (open) { + onClose(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [pathname]); + + return ( + + + + ); +} + +// ---------------------------------------------------------------------- + +export function NavContent({ data, slots, workspaces, sx }: NavContentProps) { + const pathname = usePathname(); + + return ( + <> + + + {slots?.topArea} + + + + + + + {data.map((item) => { + const isActived = item.path === pathname; + + return ( + + ({ + pl: 2, + py: 1, + gap: 2, + pr: 1.5, + borderRadius: 0.75, + typography: 'body2', + fontWeight: 'fontWeightMedium', + color: theme.vars.palette.text.secondary, + minHeight: 44, + ...(isActived && { + fontWeight: 'fontWeightSemiBold', + color: theme.vars.palette.primary.main, + bgcolor: varAlpha(theme.vars.palette.primary.mainChannel, 0.08), + '&:hover': { + bgcolor: varAlpha(theme.vars.palette.primary.mainChannel, 0.16), + }, + }), + }), + ]} + > + + {item.icon} + + + + {item.title} + + + {item.info && item.info} + + + ); + })} + + + + + {slots?.bottomArea} + + + + ); +} diff --git a/src/layouts/nav-config-account.tsx b/src/layouts/nav-config-account.tsx new file mode 100644 index 0000000..ea32510 --- /dev/null +++ b/src/layouts/nav-config-account.tsx @@ -0,0 +1,23 @@ +import { Iconify } from 'src/components/iconify'; + +import type { AccountPopoverProps } from './components/account-popover'; + +// ---------------------------------------------------------------------- + +export const _account: AccountPopoverProps['data'] = [ + { + label: 'Home', + href: '/', + icon: , + }, + { + label: 'Profile', + href: '#', + icon: , + }, + { + label: 'Settings', + href: '#', + icon: , + }, +]; diff --git a/src/layouts/nav-config-dashboard.tsx b/src/layouts/nav-config-dashboard.tsx new file mode 100644 index 0000000..ccd2cd0 --- /dev/null +++ b/src/layouts/nav-config-dashboard.tsx @@ -0,0 +1,51 @@ +import { Label } from 'src/components/label'; +import { SvgColor } from 'src/components/svg-color'; + +// ---------------------------------------------------------------------- + +const icon = (name: string) => ; + +export type NavItem = { + title: string; + path: string; + icon: React.ReactNode; + info?: React.ReactNode; +}; + +export const navData = [ + { + title: 'Dashboard', + path: '/', + icon: icon('ic-analytics'), + }, + { + title: 'User', + path: '/user', + icon: icon('ic-user'), + }, + { + title: 'Product', + path: '/products', + icon: icon('ic-cart'), + info: ( + + ), + }, + { + title: 'Blog', + path: '/blog', + icon: icon('ic-blog'), + }, + { + title: 'Sign in', + path: '/sign-in', + icon: icon('ic-lock'), + }, + { + title: 'Not found', + path: '/404', + icon: icon('ic-disabled'), + }, +]; diff --git a/src/layouts/nav-config-workspace.tsx b/src/layouts/nav-config-workspace.tsx new file mode 100644 index 0000000..b665f88 --- /dev/null +++ b/src/layouts/nav-config-workspace.tsx @@ -0,0 +1,24 @@ +import type { WorkspacesPopoverProps } from './components/workspaces-popover'; + +// ---------------------------------------------------------------------- + +export const _workspaces: WorkspacesPopoverProps['data'] = [ + { + id: 'team-1', + name: 'Team 1', + plan: 'Free', + logo: '/assets/icons/workspaces/logo-1.webp', + }, + { + id: 'team-2', + name: 'Team 2', + plan: 'Pro', + logo: '/assets/icons/workspaces/logo-2.webp', + }, + { + id: 'team-3', + name: 'Team 3', + plan: 'Pro', + logo: '/assets/icons/workspaces/logo-3.webp', + }, +]; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..9ae50be --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,29 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { Outlet, RouterProvider, createBrowserRouter } from 'react-router'; + +import App from './app'; +import { routesSection } from './routes/sections'; +import { ErrorBoundary } from './routes/components'; + +// ---------------------------------------------------------------------- + +const router = createBrowserRouter([ + { + Component: () => ( + + + + ), + errorElement: , + children: routesSection, + }, +]); + +const root = createRoot(document.getElementById('root')!); + +root.render( + + + +); diff --git a/src/pages/blog.tsx b/src/pages/blog.tsx new file mode 100644 index 0000000..2ce43be --- /dev/null +++ b/src/pages/blog.tsx @@ -0,0 +1,16 @@ +import { _posts } from 'src/_mock'; +import { CONFIG } from 'src/config-global'; + +import { BlogView } from 'src/sections/blog/view'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`Blog - ${CONFIG.appName}`} + + + + ); +} diff --git a/src/pages/dashboard.tsx b/src/pages/dashboard.tsx new file mode 100644 index 0000000..a078c39 --- /dev/null +++ b/src/pages/dashboard.tsx @@ -0,0 +1,20 @@ +import { CONFIG } from 'src/config-global'; + +import { OverviewAnalyticsView as DashboardView } from 'src/sections/overview/view'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`Dashboard - ${CONFIG.appName}`} + + + + + + ); +} diff --git a/src/pages/page-not-found.tsx b/src/pages/page-not-found.tsx new file mode 100644 index 0000000..3cb7ff1 --- /dev/null +++ b/src/pages/page-not-found.tsx @@ -0,0 +1,15 @@ +import { CONFIG } from 'src/config-global'; + +import { NotFoundView } from 'src/sections/error'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`404 page not found! | Error - ${CONFIG.appName}`} + + + + ); +} diff --git a/src/pages/products.tsx b/src/pages/products.tsx new file mode 100644 index 0000000..049603b --- /dev/null +++ b/src/pages/products.tsx @@ -0,0 +1,15 @@ +import { CONFIG } from 'src/config-global'; + +import { ProductsView } from 'src/sections/product/view'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`Products - ${CONFIG.appName}`} + + + + ); +} diff --git a/src/pages/sign-in.tsx b/src/pages/sign-in.tsx new file mode 100644 index 0000000..dcc440c --- /dev/null +++ b/src/pages/sign-in.tsx @@ -0,0 +1,15 @@ +import { CONFIG } from 'src/config-global'; + +import { SignInView } from 'src/sections/auth'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`Sign in - ${CONFIG.appName}`} + + + + ); +} diff --git a/src/pages/user.tsx b/src/pages/user.tsx new file mode 100644 index 0000000..68e1adc --- /dev/null +++ b/src/pages/user.tsx @@ -0,0 +1,15 @@ +import { CONFIG } from 'src/config-global'; + +import { UserView } from 'src/sections/user/view'; + +// ---------------------------------------------------------------------- + +export default function Page() { + return ( + <> + {`Users - ${CONFIG.appName}`} + + + + ); +} diff --git a/src/routes/components/error-boundary.tsx b/src/routes/components/error-boundary.tsx new file mode 100644 index 0000000..66a0326 --- /dev/null +++ b/src/routes/components/error-boundary.tsx @@ -0,0 +1,168 @@ +import type { Theme, CSSObject } from '@mui/material/styles'; + +import { useRouteError, isRouteErrorResponse } from 'react-router'; + +import GlobalStyles from '@mui/material/GlobalStyles'; + +// ---------------------------------------------------------------------- + +export function ErrorBoundary() { + const error = useRouteError(); + + return ( + <> + {inputGlobalStyles()} + +
    +
    {renderErrorMessage(error)}
    +
    + + ); +} + +// ---------------------------------------------------------------------- + +function parseStackTrace(stack?: string) { + if (!stack) return { filePath: null, functionName: null }; + + const filePathMatch = stack.match(/\/src\/[^?]+/); + const functionNameMatch = stack.match(/at (\S+)/); + + return { + filePath: filePathMatch ? filePathMatch[0] : null, + functionName: functionNameMatch ? functionNameMatch[1] : null, + }; +} + +function renderErrorMessage(error: any) { + if (isRouteErrorResponse(error)) { + return ( + <> +

    + {error.status}: {error.statusText} +

    +

    {error.data}

    + + ); + } + + if (error instanceof Error) { + const { filePath, functionName } = parseStackTrace(error.stack); + + return ( + <> +

    Unexpected Application Error!

    +

    + {error.name}: {error.message} +

    +
    {error.stack}
    + {(filePath || functionName) && ( +

    + {filePath} ({functionName}) +

    + )} + + ); + } + + return

    Unknown Error

    ; +} + +// ---------------------------------------------------------------------- + +const errorBoundaryClasses = { + root: 'error-boundary-root', + container: 'error-boundary-container', + title: 'error-boundary-title', + details: 'error-boundary-details', + message: 'error-boundary-message', + filePath: 'error-boundary-file-path', +}; + +const cssVars: CSSObject = { + '--info-color': '#2dd9da', + '--warning-color': '#e2aa53', + '--error-color': '#ff5555', + '--error-background': '#2a1e1e', + '--details-background': '#111111', + '--root-background': '#2c2c2e', + '--container-background': '#1c1c1e', + '--font-stack-monospace': + '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace', + '--font-stack-sans': + '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"', +}; + +const rootStyles = (): CSSObject => ({ + display: 'flex', + flex: '1 1 auto', + alignItems: 'center', + padding: '10vh 15px 0', + flexDirection: 'column', + fontFamily: 'var(--font-stack-sans)', +}); + +const contentStyles = (): CSSObject => ({ + gap: 24, + padding: 20, + width: '100%', + maxWidth: 960, + display: 'flex', + borderRadius: 8, + flexDirection: 'column', + backgroundColor: 'var(--container-background)', +}); + +const titleStyles = (theme: Theme): CSSObject => ({ + margin: 0, + lineHeight: 1.2, + fontSize: theme.typography.pxToRem(20), + fontWeight: theme.typography.fontWeightBold, +}); + +const messageStyles = (theme: Theme): CSSObject => ({ + margin: 0, + lineHeight: 1.5, + padding: '12px 16px', + whiteSpace: 'pre-wrap', + color: 'var(--error-color)', + fontSize: theme.typography.pxToRem(14), + fontFamily: 'var(--font-stack-monospace)', + backgroundColor: 'var(--error-background)', + borderLeft: '2px solid var(--error-color)', + fontWeight: theme.typography.fontWeightBold, +}); + +const detailsStyles = (): CSSObject => ({ + margin: 0, + padding: 16, + lineHeight: 1.5, + overflow: 'auto', + borderRadius: 'inherit', + color: 'var(--warning-color)', + backgroundColor: 'var(--details-background)', +}); + +const filePathStyles = (): CSSObject => ({ + marginTop: 0, + color: 'var(--info-color)', +}); + +const inputGlobalStyles = () => ( + ({ + body: { + ...cssVars, + margin: 0, + color: 'white', + backgroundColor: 'var(--root-background)', + [`& .${errorBoundaryClasses.root}`]: rootStyles(), + [`& .${errorBoundaryClasses.container}`]: contentStyles(), + [`& .${errorBoundaryClasses.title}`]: titleStyles(theme), + [`& .${errorBoundaryClasses.message}`]: messageStyles(theme), + [`& .${errorBoundaryClasses.filePath}`]: filePathStyles(), + [`& .${errorBoundaryClasses.details}`]: detailsStyles(), + }, + })} + /> +); diff --git a/src/routes/components/index.ts b/src/routes/components/index.ts new file mode 100644 index 0000000..12530ea --- /dev/null +++ b/src/routes/components/index.ts @@ -0,0 +1,3 @@ +export * from './router-link'; + +export * from './error-boundary'; diff --git a/src/routes/components/router-link.tsx b/src/routes/components/router-link.tsx new file mode 100644 index 0000000..ac48a76 --- /dev/null +++ b/src/routes/components/router-link.tsx @@ -0,0 +1,14 @@ +import type { LinkProps } from 'react-router'; + +import { Link } from 'react-router'; + +// ---------------------------------------------------------------------- + +interface RouterLinkProps extends Omit { + href: string; + ref?: React.RefObject; +} + +export function RouterLink({ href, ref, ...other }: RouterLinkProps) { + return ; +} diff --git a/src/routes/hooks/index.ts b/src/routes/hooks/index.ts new file mode 100644 index 0000000..03b7351 --- /dev/null +++ b/src/routes/hooks/index.ts @@ -0,0 +1,3 @@ +export { useRouter } from './use-router'; + +export { usePathname } from './use-pathname'; diff --git a/src/routes/hooks/use-pathname.ts b/src/routes/hooks/use-pathname.ts new file mode 100644 index 0000000..76a035e --- /dev/null +++ b/src/routes/hooks/use-pathname.ts @@ -0,0 +1,10 @@ +import { useMemo } from 'react'; +import { useLocation } from 'react-router'; + +// ---------------------------------------------------------------------- + +export function usePathname() { + const { pathname } = useLocation(); + + return useMemo(() => pathname, [pathname]); +} diff --git a/src/routes/hooks/use-router.ts b/src/routes/hooks/use-router.ts new file mode 100644 index 0000000..2a7ecf6 --- /dev/null +++ b/src/routes/hooks/use-router.ts @@ -0,0 +1,21 @@ +import { useMemo } from 'react'; +import { useNavigate } from 'react-router'; + +// ---------------------------------------------------------------------- + +export function useRouter() { + const navigate = useNavigate(); + + const router = useMemo( + () => ({ + back: () => navigate(-1), + forward: () => navigate(1), + refresh: () => navigate(0), + push: (href: string) => navigate(href), + replace: (href: string) => navigate(href, { replace: true }), + }), + [navigate] + ); + + return router; +} diff --git a/src/routes/sections.tsx b/src/routes/sections.tsx new file mode 100644 index 0000000..20009c7 --- /dev/null +++ b/src/routes/sections.tsx @@ -0,0 +1,71 @@ +import type { RouteObject } from 'react-router'; + +import { lazy, Suspense } from 'react'; +import { Outlet } from 'react-router-dom'; +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress'; + +import { AuthLayout } from 'src/layouts/auth'; +import { DashboardLayout } from 'src/layouts/dashboard'; + +// ---------------------------------------------------------------------- + +export const DashboardPage = lazy(() => import('src/pages/dashboard')); +export const BlogPage = lazy(() => import('src/pages/blog')); +export const UserPage = lazy(() => import('src/pages/user')); +export const SignInPage = lazy(() => import('src/pages/sign-in')); +export const ProductsPage = lazy(() => import('src/pages/products')); +export const Page404 = lazy(() => import('src/pages/page-not-found')); + +const renderFallback = () => ( + + varAlpha(theme.vars.palette.text.primaryChannel, 0.16), + [`& .${linearProgressClasses.bar}`]: { bgcolor: 'text.primary' }, + }} + /> + +); + +export const routesSection: RouteObject[] = [ + { + element: ( + + + + + + ), + children: [ + { index: true, element: }, + { path: 'user', element: }, + { path: 'products', element: }, + { path: 'blog', element: }, + ], + }, + { + path: 'sign-in', + element: ( + + + + ), + }, + { + path: '404', + element: , + }, + { path: '*', element: }, +]; diff --git a/src/sections/auth/index.ts b/src/sections/auth/index.ts new file mode 100644 index 0000000..d9ccca2 --- /dev/null +++ b/src/sections/auth/index.ts @@ -0,0 +1 @@ +export * from './sign-in-view'; diff --git a/src/sections/auth/sign-in-view.tsx b/src/sections/auth/sign-in-view.tsx new file mode 100644 index 0000000..09d3dd9 --- /dev/null +++ b/src/sections/auth/sign-in-view.tsx @@ -0,0 +1,136 @@ +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Button from '@mui/material/Button'; +import Divider from '@mui/material/Divider'; +import TextField from '@mui/material/TextField'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import InputAdornment from '@mui/material/InputAdornment'; + +import { useRouter } from 'src/routes/hooks'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +export function SignInView() { + const router = useRouter(); + + const [showPassword, setShowPassword] = useState(false); + + const handleSignIn = useCallback(() => { + router.push('/'); + }, [router]); + + const renderForm = ( + + + + + Forgot password? + + + + setShowPassword(!showPassword)} edge="end"> + + + + ), + }, + }} + sx={{ mb: 3 }} + /> + + + + ); + + return ( + <> + + Sign in + + Don’t have an account? + + Get started + + + + {renderForm} + + + OR + + + + + + + + + + + + + + + ); +} diff --git a/src/sections/blog/post-item.tsx b/src/sections/blog/post-item.tsx new file mode 100644 index 0000000..90980bf --- /dev/null +++ b/src/sections/blog/post-item.tsx @@ -0,0 +1,211 @@ +import type { CardProps } from '@mui/material/Card'; +import type { IconifyName } from 'src/components/iconify'; + +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Card from '@mui/material/Card'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; + +import { fDate } from 'src/utils/format-time'; +import { fShortenNumber } from 'src/utils/format-number'; + +import { Iconify } from 'src/components/iconify'; +import { SvgColor } from 'src/components/svg-color'; + +// ---------------------------------------------------------------------- + +export type IPostItem = { + id: string; + title: string; + coverUrl: string; + totalViews: number; + description: string; + totalShares: number; + totalComments: number; + totalFavorites: number; + postedAt: string | number | null; + author: { + name: string; + avatarUrl: string; + }; +}; + +export function PostItem({ + sx, + post, + latestPost, + latestPostLarge, + ...other +}: CardProps & { + post: IPostItem; + latestPost: boolean; + latestPostLarge: boolean; +}) { + const renderAvatar = ( + + ); + + const renderTitle = ( + + {post.title} + + ); + + const renderInfo = ( + + {[ + { number: post.totalComments, icon: 'solar:chat-round-dots-bold' }, + { number: post.totalViews, icon: 'solar:eye-bold' }, + { number: post.totalShares, icon: 'solar:share-bold' }, + ].map((info, _index) => ( + + + {fShortenNumber(info.number)} + + ))} + + ); + + const renderCover = ( + + ); + + const renderDate = ( + + {fDate(post.postedAt)} + + ); + + const renderShape = ( + + ); + + return ( + + ({ + position: 'relative', + pt: 'calc(100% * 3 / 4)', + ...((latestPostLarge || latestPost) && { + pt: 'calc(100% * 4 / 3)', + '&:after': { + top: 0, + content: "''", + width: '100%', + height: '100%', + position: 'absolute', + bgcolor: varAlpha(theme.palette.grey['900Channel'], 0.72), + }, + }), + ...(latestPostLarge && { + pt: { + xs: 'calc(100% * 4 / 3)', + sm: 'calc(100% * 3 / 4.66)', + }, + }), + })} + > + {renderShape} + {renderAvatar} + {renderCover} + + + ({ + p: theme.spacing(6, 3, 3, 3), + ...((latestPostLarge || latestPost) && { + width: 1, + bottom: 0, + position: 'absolute', + }), + })} + > + {renderDate} + {renderTitle} + {renderInfo} + + + ); +} diff --git a/src/sections/blog/post-search.tsx b/src/sections/blog/post-search.tsx new file mode 100644 index 0000000..828a0b8 --- /dev/null +++ b/src/sections/blog/post-search.tsx @@ -0,0 +1,59 @@ +import type { Theme, SxProps } from '@mui/material/styles'; + +import TextField from '@mui/material/TextField'; +import InputAdornment from '@mui/material/InputAdornment'; +import Autocomplete, { autocompleteClasses } from '@mui/material/Autocomplete'; + +import { Iconify } from 'src/components/iconify'; + +import type { IPostItem } from './post-item'; + +// ---------------------------------------------------------------------- + +type PostSearchProps = { + posts: IPostItem[]; + sx?: SxProps; +}; + +export function PostSearch({ posts, sx }: PostSearchProps) { + return ( + post.title} + isOptionEqualToValue={(option, value) => option.id === value.id} + renderInput={(params) => ( + + + + ), + }, + }} + /> + )} + /> + ); +} diff --git a/src/sections/blog/post-sort.tsx b/src/sections/blog/post-sort.tsx new file mode 100644 index 0000000..9b1c155 --- /dev/null +++ b/src/sections/blog/post-sort.tsx @@ -0,0 +1,96 @@ +import type { ButtonProps } from '@mui/material/Button'; + +import { useState, useCallback } from 'react'; +import { varAlpha } from 'minimal-shared/utils'; + +import Button from '@mui/material/Button'; +import Popover from '@mui/material/Popover'; +import MenuList from '@mui/material/MenuList'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type PostSortProps = ButtonProps & { + sortBy: string; + onSort: (newSort: string) => void; + options: { value: string; label: string }[]; +}; + +export function PostSort({ options, sortBy, onSort, sx, ...other }: PostSortProps) { + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + return ( + <> + + + + + {options.map((option) => ( + { + onSort(option.value); + handleClosePopover(); + }} + > + {option.label} + + ))} + + + + ); +} diff --git a/src/sections/blog/view/blog-view.tsx b/src/sections/blog/view/blog-view.tsx new file mode 100644 index 0000000..37d7ea9 --- /dev/null +++ b/src/sections/blog/view/blog-view.tsx @@ -0,0 +1,96 @@ +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import Pagination from '@mui/material/Pagination'; + +import { DashboardContent } from 'src/layouts/dashboard'; + +import { Iconify } from 'src/components/iconify'; + +import { PostItem } from '../post-item'; +import { PostSort } from '../post-sort'; +import { PostSearch } from '../post-search'; + +import type { IPostItem } from '../post-item'; + +// ---------------------------------------------------------------------- + +type Props = { + posts: IPostItem[]; +}; + +export function BlogView({ posts }: Props) { + const [sortBy, setSortBy] = useState('latest'); + + const handleSort = useCallback((newSort: string) => { + setSortBy(newSort); + }, []); + + return ( + + + + Blog + + + + + + + + + + + {posts.map((post, index) => { + const latestPostLarge = index === 0; + const latestPost = index === 1 || index === 2; + + return ( + + + + ); + })} + + + + + ); +} diff --git a/src/sections/blog/view/index.ts b/src/sections/blog/view/index.ts new file mode 100644 index 0000000..f7cb1c6 --- /dev/null +++ b/src/sections/blog/view/index.ts @@ -0,0 +1 @@ +export * from './blog-view'; diff --git a/src/sections/error/index.ts b/src/sections/error/index.ts new file mode 100644 index 0000000..f642972 --- /dev/null +++ b/src/sections/error/index.ts @@ -0,0 +1 @@ +export * from './not-found-view'; diff --git a/src/sections/error/not-found-view.tsx b/src/sections/error/not-found-view.tsx new file mode 100644 index 0000000..34e5d8b --- /dev/null +++ b/src/sections/error/not-found-view.tsx @@ -0,0 +1,52 @@ +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Typography from '@mui/material/Typography'; + +import { RouterLink } from 'src/routes/components'; + +import { Logo } from 'src/components/logo'; + +// ---------------------------------------------------------------------- + +export function NotFoundView() { + return ( + <> + + + + + Sorry, page not found! + + + + Sorry, we couldn’t find the page you’re looking for. Perhaps you’ve mistyped the URL? Be + sure to check your spelling. + + + + + + + + ); +} diff --git a/src/sections/overview/analytics-conversion-rates.tsx b/src/sections/overview/analytics-conversion-rates.tsx new file mode 100644 index 0000000..7b8e737 --- /dev/null +++ b/src/sections/overview/analytics-conversion-rates.tsx @@ -0,0 +1,82 @@ +import type { CardProps } from '@mui/material/Card'; +import type { ChartOptions } from 'src/components/chart'; + +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import { useTheme, alpha as hexAlpha } from '@mui/material/styles'; + +import { fNumber } from 'src/utils/format-number'; + +import { Chart, useChart } from 'src/components/chart'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + chart: { + colors?: string[]; + categories?: string[]; + series: { + name: string; + data: number[]; + }[]; + options?: ChartOptions; + }; +}; + +export function AnalyticsConversionRates({ title, subheader, chart, sx, ...other }: Props) { + const theme = useTheme(); + + const chartColors = chart.colors ?? [ + theme.palette.primary.dark, + hexAlpha(theme.palette.primary.dark, 0.24), + ]; + + const chartOptions = useChart({ + colors: chartColors, + stroke: { width: 2, colors: ['transparent'] }, + tooltip: { + shared: true, + intersect: false, + y: { + formatter: (value: number) => fNumber(value), + title: { formatter: (seriesName: string) => `${seriesName}: ` }, + }, + }, + xaxis: { categories: chart.categories }, + dataLabels: { + enabled: true, + offsetX: -6, + style: { fontSize: '10px', colors: ['#FFFFFF', theme.palette.text.primary] }, + }, + plotOptions: { + bar: { + horizontal: true, + borderRadius: 2, + barHeight: '48%', + dataLabels: { position: 'top' }, + }, + }, + ...chart.options, + }); + + return ( + + + + + + ); +} diff --git a/src/sections/overview/analytics-current-subject.tsx b/src/sections/overview/analytics-current-subject.tsx new file mode 100644 index 0000000..87dc344 --- /dev/null +++ b/src/sections/overview/analytics-current-subject.tsx @@ -0,0 +1,73 @@ +import type { CardProps } from '@mui/material/Card'; +import type { ChartOptions } from 'src/components/chart'; + +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import { useTheme } from '@mui/material/styles'; +import CardHeader from '@mui/material/CardHeader'; + +import { Chart, useChart, ChartLegends } from 'src/components/chart'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + chart: { + colors?: string[]; + categories: string[]; + series: { + name: string; + data: number[]; + }[]; + options?: ChartOptions; + }; +}; + +export function AnalyticsCurrentSubject({ title, subheader, chart, sx, ...other }: Props) { + const theme = useTheme(); + + const chartColors = chart.colors ?? [ + theme.palette.primary.main, + theme.palette.warning.main, + theme.palette.info.main, + ]; + + const chartOptions = useChart({ + colors: chartColors, + stroke: { width: 2 }, + fill: { opacity: 0.48 }, + xaxis: { + categories: chart.categories, + labels: { style: { colors: Array.from({ length: 6 }, () => theme.palette.text.secondary) } }, + }, + ...chart.options, + }); + + return ( + + + + + + + + item.name)} + colors={chartOptions?.colors} + sx={{ p: 3, justifyContent: 'center' }} + /> + + ); +} diff --git a/src/sections/overview/analytics-current-visits.tsx b/src/sections/overview/analytics-current-visits.tsx new file mode 100644 index 0000000..c607796 --- /dev/null +++ b/src/sections/overview/analytics-current-visits.tsx @@ -0,0 +1,81 @@ +import type { CardProps } from '@mui/material/Card'; +import type { ChartOptions } from 'src/components/chart'; + +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import { useTheme } from '@mui/material/styles'; +import CardHeader from '@mui/material/CardHeader'; + +import { fNumber } from 'src/utils/format-number'; + +import { Chart, useChart, ChartLegends } from 'src/components/chart'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + chart: { + colors?: string[]; + series: { + label: string; + value: number; + }[]; + options?: ChartOptions; + }; +}; + +export function AnalyticsCurrentVisits({ title, subheader, chart, sx, ...other }: Props) { + const theme = useTheme(); + + const chartSeries = chart.series.map((item) => item.value); + + const chartColors = chart.colors ?? [ + theme.palette.primary.main, + theme.palette.warning.light, + theme.palette.info.dark, + theme.palette.error.main, + ]; + + const chartOptions = useChart({ + chart: { sparkline: { enabled: true } }, + colors: chartColors, + labels: chart.series.map((item) => item.label), + stroke: { width: 0 }, + dataLabels: { enabled: true, dropShadow: { enabled: false } }, + tooltip: { + y: { + formatter: (value: number) => fNumber(value), + title: { formatter: (seriesName: string) => `${seriesName}` }, + }, + }, + plotOptions: { pie: { donut: { labels: { show: false } } } }, + ...chart.options, + }); + + return ( + + + + + + + + + + ); +} diff --git a/src/sections/overview/analytics-news.tsx b/src/sections/overview/analytics-news.tsx new file mode 100644 index 0000000..3b377a9 --- /dev/null +++ b/src/sections/overview/analytics-news.tsx @@ -0,0 +1,103 @@ +import type { BoxProps } from '@mui/material/Box'; +import type { CardProps } from '@mui/material/Card'; + +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Card from '@mui/material/Card'; +import Button from '@mui/material/Button'; +import Avatar from '@mui/material/Avatar'; +import CardHeader from '@mui/material/CardHeader'; +import ListItemText from '@mui/material/ListItemText'; + +import { fToNow } from 'src/utils/format-time'; + +import { Iconify } from 'src/components/iconify'; +import { Scrollbar } from 'src/components/scrollbar'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + list: { + id: string; + title: string; + coverUrl: string; + description: string; + postedAt: string | number | null; + }[]; +}; + +export function AnalyticsNews({ title, subheader, list, sx, ...other }: Props) { + return ( + + + + + + {list.map((item) => ( + + ))} + + + + + + + + ); +} + +// ---------------------------------------------------------------------- + +type ItemProps = BoxProps & { + item: Props['list'][number]; +}; + +function Item({ item, sx, ...other }: ItemProps) { + return ( + ({ + py: 2, + px: 3, + gap: 2, + display: 'flex', + alignItems: 'center', + borderBottom: `dashed 1px ${theme.vars.palette.divider}`, + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + + + {item.title}} + secondary={item.description} + slotProps={{ + primary: { noWrap: true }, + secondary: { + noWrap: true, + sx: { mt: 0.5 }, + }, + }} + /> + + + {fToNow(item.postedAt)} + + + ); +} diff --git a/src/sections/overview/analytics-order-timeline.tsx b/src/sections/overview/analytics-order-timeline.tsx new file mode 100644 index 0000000..9abb88a --- /dev/null +++ b/src/sections/overview/analytics-order-timeline.tsx @@ -0,0 +1,77 @@ +import type { CardProps } from '@mui/material/Card'; +import type { TimelineItemProps } from '@mui/lab/TimelineItem'; + +import Card from '@mui/material/Card'; +import Timeline from '@mui/lab/Timeline'; +import TimelineDot from '@mui/lab/TimelineDot'; +import Typography from '@mui/material/Typography'; +import CardHeader from '@mui/material/CardHeader'; +import TimelineContent from '@mui/lab/TimelineContent'; +import TimelineSeparator from '@mui/lab/TimelineSeparator'; +import TimelineConnector from '@mui/lab/TimelineConnector'; +import TimelineItem, { timelineItemClasses } from '@mui/lab/TimelineItem'; + +import { fDateTime } from 'src/utils/format-time'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + list: { + id: string; + type: string; + title: string; + time: string | number | null; + }[]; +}; + +export function AnalyticsOrderTimeline({ title, subheader, list, sx, ...other }: Props) { + return ( + + + + + {list.map((item, index) => ( + + ))} + + + ); +} + +// ---------------------------------------------------------------------- + +type ItemProps = TimelineItemProps & { + lastItem: boolean; + item: Props['list'][number]; +}; + +function Item({ item, lastItem, ...other }: ItemProps) { + return ( + + + + {lastItem ? null : } + + + + {item.title} + + + {fDateTime(item.time)} + + + + ); +} diff --git a/src/sections/overview/analytics-tasks.tsx b/src/sections/overview/analytics-tasks.tsx new file mode 100644 index 0000000..5accf38 --- /dev/null +++ b/src/sections/overview/analytics-tasks.tsx @@ -0,0 +1,179 @@ +import type { BoxProps } from '@mui/material/Box'; +import type { CardProps } from '@mui/material/Card'; + +import { useState } from 'react'; +import { usePopover } from 'minimal-shared/hooks'; + +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Stack from '@mui/material/Stack'; +import Popover from '@mui/material/Popover'; +import Divider from '@mui/material/Divider'; +import MenuList from '@mui/material/MenuList'; +import Checkbox from '@mui/material/Checkbox'; +import IconButton from '@mui/material/IconButton'; +import CardHeader from '@mui/material/CardHeader'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { Iconify } from 'src/components/iconify'; +import { Scrollbar } from 'src/components/scrollbar'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + list: { + id: string; + name: string; + }[]; +}; + +export function AnalyticsTasks({ title, subheader, list, sx, ...other }: Props) { + const [selected, setSelected] = useState(['2']); + + const handleClickComplete = (taskId: string) => { + const tasksCompleted = selected.includes(taskId) + ? selected.filter((value) => value !== taskId) + : [...selected, taskId]; + + setSelected(tasksCompleted); + }; + + return ( + + + + + } sx={{ minWidth: 560 }}> + {list.map((item) => ( + handleClickComplete(item.id)} + /> + ))} + + + + ); +} + +// ---------------------------------------------------------------------- + +type TaskItemProps = BoxProps & { + selected: boolean; + item: Props['list'][number]; + onChange: (id: string) => void; +}; + +function TaskItem({ item, selected, onChange, sx, ...other }: TaskItemProps) { + const menuActions = usePopover(); + + const handleMarkComplete = () => { + menuActions.onClose(); + console.info('MARK COMPLETE', item.id); + }; + + const handleShare = () => { + menuActions.onClose(); + console.info('SHARE', item.id); + }; + + const handleEdit = () => { + menuActions.onClose(); + console.info('EDIT', item.id); + }; + + const handleDelete = () => { + menuActions.onClose(); + console.info('DELETE', item.id); + }; + + return ( + <> + ({ + pl: 2, + pr: 1, + py: 1.5, + display: 'flex', + ...(selected && { + color: 'text.disabled', + textDecoration: 'line-through', + }), + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + + } + sx={{ flexGrow: 1, m: 0 }} + /> + + + + + + + + + + + Mark complete + + + + + Edit + + + + + Share + + + + + + + Delete + + + + + ); +} diff --git a/src/sections/overview/analytics-traffic-by-site.tsx b/src/sections/overview/analytics-traffic-by-site.tsx new file mode 100644 index 0000000..607b292 --- /dev/null +++ b/src/sections/overview/analytics-traffic-by-site.tsx @@ -0,0 +1,64 @@ +import type { CardProps } from '@mui/material/Card'; + +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import Typography from '@mui/material/Typography'; + +import { fShortenNumber } from 'src/utils/format-number'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + list: { value: string; label: string; total: number }[]; +}; + +export function AnalyticsTrafficBySite({ title, subheader, list, sx, ...other }: Props) { + return ( + + + + {list.map((site) => ( + ({ + py: 2.5, + display: 'flex', + borderRadius: 1.5, + textAlign: 'center', + alignItems: 'center', + flexDirection: 'column', + border: `solid 1px ${varAlpha(theme.vars.palette.grey['500Channel'], 0.12)}`, + })} + > + {site.value === 'twitter' && } + {site.value === 'facebook' && } + {site.value === 'google' && } + {site.value === 'linkedin' && } + + + {fShortenNumber(site.total)} + + + + {site.label} + + + ))} + + + ); +} diff --git a/src/sections/overview/analytics-website-visits.tsx b/src/sections/overview/analytics-website-visits.tsx new file mode 100644 index 0000000..b6ea5ee --- /dev/null +++ b/src/sections/overview/analytics-website-visits.tsx @@ -0,0 +1,61 @@ +import type { CardProps } from '@mui/material/Card'; +import type { ChartOptions } from 'src/components/chart'; + +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import { useTheme, alpha as hexAlpha } from '@mui/material/styles'; + +import { Chart, useChart } from 'src/components/chart'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title?: string; + subheader?: string; + chart: { + colors?: string[]; + categories?: string[]; + series: { + name: string; + data: number[]; + }[]; + options?: ChartOptions; + }; +}; + +export function AnalyticsWebsiteVisits({ title, subheader, chart, sx, ...other }: Props) { + const theme = useTheme(); + + const chartColors = chart.colors ?? [ + hexAlpha(theme.palette.primary.dark, 0.8), + hexAlpha(theme.palette.warning.main, 0.8), + ]; + + const chartOptions = useChart({ + colors: chartColors, + stroke: { width: 2, colors: ['transparent'] }, + xaxis: { categories: chart.categories }, + legend: { show: true }, + tooltip: { y: { formatter: (value: number) => `${value} visits` } }, + ...chart.options, + }); + + return ( + + + + + + ); +} diff --git a/src/sections/overview/analytics-widget-summary.tsx b/src/sections/overview/analytics-widget-summary.tsx new file mode 100644 index 0000000..efecd09 --- /dev/null +++ b/src/sections/overview/analytics-widget-summary.tsx @@ -0,0 +1,142 @@ +import type { CardProps } from '@mui/material/Card'; +import type { PaletteColorKey } from 'src/theme/core'; +import type { ChartOptions } from 'src/components/chart'; + +import { varAlpha } from 'minimal-shared/utils'; + +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import { useTheme } from '@mui/material/styles'; + +import { fNumber, fPercent, fShortenNumber } from 'src/utils/format-number'; + +import { Iconify } from 'src/components/iconify'; +import { SvgColor } from 'src/components/svg-color'; +import { Chart, useChart } from 'src/components/chart'; + +// ---------------------------------------------------------------------- + +type Props = CardProps & { + title: string; + total: number; + percent: number; + color?: PaletteColorKey; + icon: React.ReactNode; + chart: { + series: number[]; + categories: string[]; + options?: ChartOptions; + }; +}; + +export function AnalyticsWidgetSummary({ + sx, + icon, + title, + total, + chart, + percent, + color = 'primary', + ...other +}: Props) { + const theme = useTheme(); + + const chartColors = [theme.palette[color].dark]; + + const chartOptions = useChart({ + chart: { sparkline: { enabled: true } }, + colors: chartColors, + xaxis: { categories: chart.categories }, + grid: { + padding: { + top: 6, + left: 6, + right: 6, + bottom: 6, + }, + }, + tooltip: { + y: { formatter: (value: number) => fNumber(value), title: { formatter: () => '' } }, + }, + markers: { + strokeWidth: 0, + }, + ...chart.options, + }); + + const renderTrending = () => ( + + + + {percent > 0 && '+'} + {fPercent(percent)} + + + ); + + return ( + ({ + p: 3, + boxShadow: 'none', + position: 'relative', + color: `${color}.darker`, + backgroundColor: 'common.white', + backgroundImage: `linear-gradient(135deg, ${varAlpha(theme.vars.palette[color].lighterChannel, 0.48)}, ${varAlpha(theme.vars.palette[color].lightChannel, 0.48)})`, + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + {icon} + + {renderTrending()} + + + + {title} + + {fShortenNumber(total)} + + + + + + + + ); +} diff --git a/src/sections/overview/view/index.ts b/src/sections/overview/view/index.ts new file mode 100644 index 0000000..fb212b4 --- /dev/null +++ b/src/sections/overview/view/index.ts @@ -0,0 +1 @@ +export * from './overview-analytics-view'; diff --git a/src/sections/overview/view/overview-analytics-view.tsx b/src/sections/overview/view/overview-analytics-view.tsx new file mode 100644 index 0000000..a98ca5b --- /dev/null +++ b/src/sections/overview/view/overview-analytics-view.tsx @@ -0,0 +1,156 @@ +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; + +import { DashboardContent } from 'src/layouts/dashboard'; +import { _posts, _tasks, _traffic, _timeline } from 'src/_mock'; + +import { AnalyticsNews } from '../analytics-news'; +import { AnalyticsTasks } from '../analytics-tasks'; +import { AnalyticsCurrentVisits } from '../analytics-current-visits'; +import { AnalyticsOrderTimeline } from '../analytics-order-timeline'; +import { AnalyticsWebsiteVisits } from '../analytics-website-visits'; +import { AnalyticsWidgetSummary } from '../analytics-widget-summary'; +import { AnalyticsTrafficBySite } from '../analytics-traffic-by-site'; +import { AnalyticsCurrentSubject } from '../analytics-current-subject'; +import { AnalyticsConversionRates } from '../analytics-conversion-rates'; + +// ---------------------------------------------------------------------- + +export function OverviewAnalyticsView() { + return ( + + + Hi, Welcome back 👋 + + + + + } + chart={{ + categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'], + series: [22, 8, 35, 50, 82, 84, 77, 12], + }} + /> + + + + } + chart={{ + categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'], + series: [56, 47, 40, 62, 73, 30, 23, 54], + }} + /> + + + + } + chart={{ + categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'], + series: [40, 70, 50, 28, 70, 75, 7, 64], + }} + /> + + + + } + chart={{ + categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug'], + series: [56, 30, 23, 54, 47, 40, 62, 73], + }} + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/src/sections/product/product-cart-widget.tsx b/src/sections/product/product-cart-widget.tsx new file mode 100644 index 0000000..3084060 --- /dev/null +++ b/src/sections/product/product-cart-widget.tsx @@ -0,0 +1,47 @@ +import type { BoxProps } from '@mui/material/Box'; + +import Box from '@mui/material/Box'; +import Badge from '@mui/material/Badge'; + +import { RouterLink } from 'src/routes/components'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type CartIconProps = BoxProps & { + totalItems: number; +}; + +export function CartIcon({ totalItems, sx, ...other }: CartIconProps) { + return ( + ({ + right: 0, + top: 112, + zIndex: 999, + display: 'flex', + cursor: 'pointer', + position: 'fixed', + color: 'text.primary', + borderTopLeftRadius: 16, + borderBottomLeftRadius: 16, + bgcolor: 'background.paper', + padding: theme.spacing(1, 3, 1, 2), + boxShadow: theme.vars.customShadows.dropdown, + transition: theme.transitions.create(['opacity']), + '&:hover': { opacity: 0.72 }, + }), + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...other} + > + + + + + ); +} diff --git a/src/sections/product/product-filters.tsx b/src/sections/product/product-filters.tsx new file mode 100644 index 0000000..3777a98 --- /dev/null +++ b/src/sections/product/product-filters.tsx @@ -0,0 +1,232 @@ +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Radio from '@mui/material/Radio'; +import Badge from '@mui/material/Badge'; +import Button from '@mui/material/Button'; +import Drawer from '@mui/material/Drawer'; +import Rating from '@mui/material/Rating'; +import Divider from '@mui/material/Divider'; +import Checkbox from '@mui/material/Checkbox'; +import FormGroup from '@mui/material/FormGroup'; +import RadioGroup from '@mui/material/RadioGroup'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import FormControlLabel from '@mui/material/FormControlLabel'; + +import { Iconify } from 'src/components/iconify'; +import { Scrollbar } from 'src/components/scrollbar'; +import { ColorPicker } from 'src/components/color-utils'; + +// ---------------------------------------------------------------------- + +export type FiltersProps = { + price: string; + rating: string; + gender: string[]; + colors: string[]; + category: string; +}; + +type ProductFiltersProps = { + canReset: boolean; + openFilter: boolean; + filters: FiltersProps; + onOpenFilter: () => void; + onCloseFilter: () => void; + onResetFilter: () => void; + onSetFilters: (updateState: Partial) => void; + options: { + colors: string[]; + ratings: string[]; + categories: { value: string; label: string }[]; + genders: { value: string; label: string }[]; + price: { value: string; label: string }[]; + }; +}; + +export function ProductFilters({ + filters, + options, + canReset, + openFilter, + onSetFilters, + onOpenFilter, + onCloseFilter, + onResetFilter, +}: ProductFiltersProps) { + const renderGender = ( + + Gender + + {options.genders.map((option) => ( + { + const checked = filters.gender.includes(option.value) + ? filters.gender.filter((value) => value !== option.value) + : [...filters.gender, option.value]; + + onSetFilters({ gender: checked }); + }} + /> + } + label={option.label} + /> + ))} + + + ); + + const renderCategory = ( + + Category + + {options.categories.map((option) => ( + onSetFilters({ category: option.value })} + /> + } + label={option.label} + /> + ))} + + + ); + + const renderColors = ( + + Colors + onSetFilters({ colors: colors as string[] })} + limit={6} + /> + + ); + + const renderPrice = ( + + Price + + {options.price.map((option) => ( + onSetFilters({ price: option.value })} + /> + } + label={option.label} + /> + ))} + + + ); + + const renderRating = ( + + + Rating + + + {options.ratings.map((option, index) => ( + onSetFilters({ rating: option })} + sx={{ + mb: 1, + gap: 1, + ml: -1, + p: 0.5, + display: 'flex', + borderRadius: 1, + cursor: 'pointer', + typography: 'body2', + alignItems: 'center', + '&:hover': { opacity: 0.48 }, + ...(filters.rating === option && { + bgcolor: 'action.selected', + }), + }} + > + & Up + + ))} + + ); + + return ( + <> + + + + + + Filters + + + + + + + + + + + + + + + + + + {renderGender} + {renderCategory} + {renderColors} + {renderPrice} + {renderRating} + + + + + ); +} diff --git a/src/sections/product/product-item.tsx b/src/sections/product/product-item.tsx new file mode 100644 index 0000000..722d340 --- /dev/null +++ b/src/sections/product/product-item.tsx @@ -0,0 +1,98 @@ +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Card from '@mui/material/Card'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { fCurrency } from 'src/utils/format-number'; + +import { Label } from 'src/components/label'; +import { ColorPreview } from 'src/components/color-utils'; + +// ---------------------------------------------------------------------- + +export type ProductItemProps = { + id: string; + name: string; + price: number; + status: string; + coverUrl: string; + colors: string[]; + priceSale: number | null; +}; + +export function ProductItem({ product }: { product: ProductItemProps }) { + const renderStatus = ( + + ); + + const renderImg = ( + + ); + + const renderPrice = ( + + + {product.priceSale && fCurrency(product.priceSale)} + +   + {fCurrency(product.price)} + + ); + + return ( + + + {product.status && renderStatus} + {renderImg} + + + + + {product.name} + + + + + {renderPrice} + + + + ); +} diff --git a/src/sections/product/product-sort.tsx b/src/sections/product/product-sort.tsx new file mode 100644 index 0000000..6fcade4 --- /dev/null +++ b/src/sections/product/product-sort.tsx @@ -0,0 +1,91 @@ +import type { ButtonProps } from '@mui/material/Button'; + +import { useState, useCallback } from 'react'; + +import Button from '@mui/material/Button'; +import Popover from '@mui/material/Popover'; +import MenuList from '@mui/material/MenuList'; +import Typography from '@mui/material/Typography'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type ProductSortProps = ButtonProps & { + sortBy: string; + onSort: (newSort: string) => void; + options: { value: string; label: string }[]; +}; + +export function ProductSort({ options, sortBy, onSort, sx, ...other }: ProductSortProps) { + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + return ( + <> + + + + + {options.map((option) => ( + { + onSort(option.value); + handleClosePopover(); + }} + > + {option.label} + + ))} + + + + ); +} diff --git a/src/sections/product/view/index.ts b/src/sections/product/view/index.ts new file mode 100644 index 0000000..6a59b36 --- /dev/null +++ b/src/sections/product/view/index.ts @@ -0,0 +1 @@ +export * from './products-view'; diff --git a/src/sections/product/view/products-view.tsx b/src/sections/product/view/products-view.tsx new file mode 100644 index 0000000..8b42910 --- /dev/null +++ b/src/sections/product/view/products-view.tsx @@ -0,0 +1,152 @@ +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Pagination from '@mui/material/Pagination'; +import Typography from '@mui/material/Typography'; + +import { _products } from 'src/_mock'; +import { DashboardContent } from 'src/layouts/dashboard'; + +import { ProductItem } from '../product-item'; +import { ProductSort } from '../product-sort'; +import { CartIcon } from '../product-cart-widget'; +import { ProductFilters } from '../product-filters'; + +import type { FiltersProps } from '../product-filters'; + +// ---------------------------------------------------------------------- + +const GENDER_OPTIONS = [ + { value: 'men', label: 'Men' }, + { value: 'women', label: 'Women' }, + { value: 'kids', label: 'Kids' }, +]; + +const CATEGORY_OPTIONS = [ + { value: 'all', label: 'All' }, + { value: 'shose', label: 'Shose' }, + { value: 'apparel', label: 'Apparel' }, + { value: 'accessories', label: 'Accessories' }, +]; + +const RATING_OPTIONS = ['up4Star', 'up3Star', 'up2Star', 'up1Star']; + +const PRICE_OPTIONS = [ + { value: 'below', label: 'Below $25' }, + { value: 'between', label: 'Between $25 - $75' }, + { value: 'above', label: 'Above $75' }, +]; + +const COLOR_OPTIONS = [ + '#00AB55', + '#000000', + '#FFFFFF', + '#FFC0CB', + '#FF4842', + '#1890FF', + '#94D82D', + '#FFC107', +]; + +const defaultFilters = { + price: '', + gender: [GENDER_OPTIONS[0].value], + colors: [COLOR_OPTIONS[4]], + rating: RATING_OPTIONS[0], + category: CATEGORY_OPTIONS[0].value, +}; + +export function ProductsView() { + const [sortBy, setSortBy] = useState('featured'); + + const [openFilter, setOpenFilter] = useState(false); + + const [filters, setFilters] = useState(defaultFilters); + + const handleOpenFilter = useCallback(() => { + setOpenFilter(true); + }, []); + + const handleCloseFilter = useCallback(() => { + setOpenFilter(false); + }, []); + + const handleSort = useCallback((newSort: string) => { + setSortBy(newSort); + }, []); + + const handleSetFilters = useCallback((updateState: Partial) => { + setFilters((prevValue) => ({ ...prevValue, ...updateState })); + }, []); + + const canReset = Object.keys(filters).some( + (key) => filters[key as keyof FiltersProps] !== defaultFilters[key as keyof FiltersProps] + ); + + return ( + + + + + Products + + + + setFilters(defaultFilters)} + options={{ + genders: GENDER_OPTIONS, + categories: CATEGORY_OPTIONS, + ratings: RATING_OPTIONS, + price: PRICE_OPTIONS, + colors: COLOR_OPTIONS, + }} + /> + + + + + + + {_products.map((product) => ( + + + + ))} + + + + + ); +} diff --git a/src/sections/user/table-empty-rows.tsx b/src/sections/user/table-empty-rows.tsx new file mode 100644 index 0000000..6bc9ee0 --- /dev/null +++ b/src/sections/user/table-empty-rows.tsx @@ -0,0 +1,26 @@ +import type { TableRowProps } from '@mui/material/TableRow'; + +import TableRow from '@mui/material/TableRow'; +import TableCell from '@mui/material/TableCell'; + +// ---------------------------------------------------------------------- + +type TableEmptyRowsProps = TableRowProps & { + emptyRows: number; + height?: number; +}; + +export function TableEmptyRows({ emptyRows, height, sx, ...other }: TableEmptyRowsProps) { + if (!emptyRows) { + return null; + } + + return ( + + + + ); +} diff --git a/src/sections/user/table-no-data.tsx b/src/sections/user/table-no-data.tsx new file mode 100644 index 0000000..914e23f --- /dev/null +++ b/src/sections/user/table-no-data.tsx @@ -0,0 +1,32 @@ +import type { TableRowProps } from '@mui/material/TableRow'; + +import Box from '@mui/material/Box'; +import TableRow from '@mui/material/TableRow'; +import TableCell from '@mui/material/TableCell'; +import Typography from '@mui/material/Typography'; + +// ---------------------------------------------------------------------- + +type TableNoDataProps = TableRowProps & { + searchQuery: string; +}; + +export function TableNoData({ searchQuery, ...other }: TableNoDataProps) { + return ( + + + + + Not found + + + + No results found for   + "{searchQuery}". +
    Try checking for typos or using complete words. +
    +
    +
    +
    + ); +} diff --git a/src/sections/user/user-table-head.tsx b/src/sections/user/user-table-head.tsx new file mode 100644 index 0000000..3888ee7 --- /dev/null +++ b/src/sections/user/user-table-head.tsx @@ -0,0 +1,69 @@ +import Box from '@mui/material/Box'; +import TableRow from '@mui/material/TableRow'; +import Checkbox from '@mui/material/Checkbox'; +import TableHead from '@mui/material/TableHead'; +import TableCell from '@mui/material/TableCell'; +import TableSortLabel from '@mui/material/TableSortLabel'; + +import { visuallyHidden } from './utils'; + +// ---------------------------------------------------------------------- + +type UserTableHeadProps = { + orderBy: string; + rowCount: number; + numSelected: number; + order: 'asc' | 'desc'; + onSort: (id: string) => void; + headLabel: Record[]; + onSelectAllRows: (checked: boolean) => void; +}; + +export function UserTableHead({ + order, + onSort, + orderBy, + rowCount, + headLabel, + numSelected, + onSelectAllRows, +}: UserTableHeadProps) { + return ( + + + + 0 && numSelected < rowCount} + checked={rowCount > 0 && numSelected === rowCount} + onChange={(event: React.ChangeEvent) => + onSelectAllRows(event.target.checked) + } + /> + + + {headLabel.map((headCell) => ( + + onSort(headCell.id)} + > + {headCell.label} + {orderBy === headCell.id ? ( + + {order === 'desc' ? 'sorted descending' : 'sorted ascending'} + + ) : null} + + + ))} + + + ); +} diff --git a/src/sections/user/user-table-row.tsx b/src/sections/user/user-table-row.tsx new file mode 100644 index 0000000..5429428 --- /dev/null +++ b/src/sections/user/user-table-row.tsx @@ -0,0 +1,124 @@ +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Avatar from '@mui/material/Avatar'; +import Popover from '@mui/material/Popover'; +import TableRow from '@mui/material/TableRow'; +import Checkbox from '@mui/material/Checkbox'; +import MenuList from '@mui/material/MenuList'; +import TableCell from '@mui/material/TableCell'; +import IconButton from '@mui/material/IconButton'; +import MenuItem, { menuItemClasses } from '@mui/material/MenuItem'; + +import { Label } from 'src/components/label'; +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +export type UserProps = { + id: string; + name: string; + role: string; + status: string; + company: string; + avatarUrl: string; + isVerified: boolean; +}; + +type UserTableRowProps = { + row: UserProps; + selected: boolean; + onSelectRow: () => void; +}; + +export function UserTableRow({ row, selected, onSelectRow }: UserTableRowProps) { + const [openPopover, setOpenPopover] = useState(null); + + const handleOpenPopover = useCallback((event: React.MouseEvent) => { + setOpenPopover(event.currentTarget); + }, []); + + const handleClosePopover = useCallback(() => { + setOpenPopover(null); + }, []); + + return ( + <> + + + + + + + + + {row.name} + + + + {row.company} + + {row.role} + + + {row.isVerified ? ( + + ) : ( + '-' + )} + + + + + + + + + + + + + + + + + + Edit + + + + + Delete + + + + + ); +} diff --git a/src/sections/user/user-table-toolbar.tsx b/src/sections/user/user-table-toolbar.tsx new file mode 100644 index 0000000..55bee2f --- /dev/null +++ b/src/sections/user/user-table-toolbar.tsx @@ -0,0 +1,66 @@ +import Tooltip from '@mui/material/Tooltip'; +import Toolbar from '@mui/material/Toolbar'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import InputAdornment from '@mui/material/InputAdornment'; + +import { Iconify } from 'src/components/iconify'; + +// ---------------------------------------------------------------------- + +type UserTableToolbarProps = { + numSelected: number; + filterName: string; + onFilterName: (event: React.ChangeEvent) => void; +}; + +export function UserTableToolbar({ numSelected, filterName, onFilterName }: UserTableToolbarProps) { + return ( + theme.spacing(0, 1, 0, 3), + ...(numSelected > 0 && { + color: 'primary.main', + bgcolor: 'primary.lighter', + }), + }} + > + {numSelected > 0 ? ( + + {numSelected} selected + + ) : ( + + + + } + sx={{ maxWidth: 320 }} + /> + )} + + {numSelected > 0 ? ( + + + + + + ) : ( + + + + + + )} + + ); +} diff --git a/src/sections/user/utils.ts b/src/sections/user/utils.ts new file mode 100644 index 0000000..162e24d --- /dev/null +++ b/src/sections/user/utils.ts @@ -0,0 +1,79 @@ +import type { UserProps } from './user-table-row'; + +// ---------------------------------------------------------------------- + +export const visuallyHidden = { + border: 0, + margin: -1, + padding: 0, + width: '1px', + height: '1px', + overflow: 'hidden', + position: 'absolute', + whiteSpace: 'nowrap', + clip: 'rect(0 0 0 0)', +} as const; + +// ---------------------------------------------------------------------- + +export function emptyRows(page: number, rowsPerPage: number, arrayLength: number) { + return page ? Math.max(0, (1 + page) * rowsPerPage - arrayLength) : 0; +} + +// ---------------------------------------------------------------------- + +function descendingComparator(a: T, b: T, orderBy: keyof T) { + if (b[orderBy] < a[orderBy]) { + return -1; + } + if (b[orderBy] > a[orderBy]) { + return 1; + } + return 0; +} + +// ---------------------------------------------------------------------- + +export function getComparator( + order: 'asc' | 'desc', + orderBy: Key +): ( + a: { + [key in Key]: number | string; + }, + b: { + [key in Key]: number | string; + } +) => number { + return order === 'desc' + ? (a, b) => descendingComparator(a, b, orderBy) + : (a, b) => -descendingComparator(a, b, orderBy); +} + +// ---------------------------------------------------------------------- + +type ApplyFilterProps = { + inputData: UserProps[]; + filterName: string; + comparator: (a: any, b: any) => number; +}; + +export function applyFilter({ inputData, comparator, filterName }: ApplyFilterProps) { + const stabilizedThis = inputData.map((el, index) => [el, index] as const); + + stabilizedThis.sort((a, b) => { + const order = comparator(a[0], b[0]); + if (order !== 0) return order; + return a[1] - b[1]; + }); + + inputData = stabilizedThis.map((el) => el[0]); + + if (filterName) { + inputData = inputData.filter( + (user) => user.name.toLowerCase().indexOf(filterName.toLowerCase()) !== -1 + ); + } + + return inputData; +} diff --git a/src/sections/user/view/index.ts b/src/sections/user/view/index.ts new file mode 100644 index 0000000..9116ca7 --- /dev/null +++ b/src/sections/user/view/index.ts @@ -0,0 +1 @@ +export * from './user-view'; diff --git a/src/sections/user/view/user-view.tsx b/src/sections/user/view/user-view.tsx new file mode 100644 index 0000000..749d4a2 --- /dev/null +++ b/src/sections/user/view/user-view.tsx @@ -0,0 +1,203 @@ +import { useState, useCallback } from 'react'; + +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Table from '@mui/material/Table'; +import Button from '@mui/material/Button'; +import TableBody from '@mui/material/TableBody'; +import Typography from '@mui/material/Typography'; +import TableContainer from '@mui/material/TableContainer'; +import TablePagination from '@mui/material/TablePagination'; + +import { _users } from 'src/_mock'; +import { DashboardContent } from 'src/layouts/dashboard'; + +import { Iconify } from 'src/components/iconify'; +import { Scrollbar } from 'src/components/scrollbar'; + +import { TableNoData } from '../table-no-data'; +import { UserTableRow } from '../user-table-row'; +import { UserTableHead } from '../user-table-head'; +import { TableEmptyRows } from '../table-empty-rows'; +import { UserTableToolbar } from '../user-table-toolbar'; +import { emptyRows, applyFilter, getComparator } from '../utils'; + +import type { UserProps } from '../user-table-row'; + +// ---------------------------------------------------------------------- + +export function UserView() { + const table = useTable(); + + const [filterName, setFilterName] = useState(''); + + const dataFiltered: UserProps[] = applyFilter({ + inputData: _users, + comparator: getComparator(table.order, table.orderBy), + filterName, + }); + + const notFound = !dataFiltered.length && !!filterName; + + return ( + + + + Users + + + + + + ) => { + setFilterName(event.target.value); + table.onResetPage(); + }} + /> + + + + + + table.onSelectAllRows( + checked, + _users.map((user) => user.id) + ) + } + headLabel={[ + { id: 'name', label: 'Name' }, + { id: 'company', label: 'Company' }, + { id: 'role', label: 'Role' }, + { id: 'isVerified', label: 'Verified', align: 'center' }, + { id: 'status', label: 'Status' }, + { id: '' }, + ]} + /> + + {dataFiltered + .slice( + table.page * table.rowsPerPage, + table.page * table.rowsPerPage + table.rowsPerPage + ) + .map((row) => ( + table.onSelectRow(row.id)} + /> + ))} + + + + {notFound && } + +
    +
    +
    + + +
    +
    + ); +} + +// ---------------------------------------------------------------------- + +export function useTable() { + const [page, setPage] = useState(0); + const [orderBy, setOrderBy] = useState('name'); + const [rowsPerPage, setRowsPerPage] = useState(5); + const [selected, setSelected] = useState([]); + const [order, setOrder] = useState<'asc' | 'desc'>('asc'); + + const onSort = useCallback( + (id: string) => { + const isAsc = orderBy === id && order === 'asc'; + setOrder(isAsc ? 'desc' : 'asc'); + setOrderBy(id); + }, + [order, orderBy] + ); + + const onSelectAllRows = useCallback((checked: boolean, newSelecteds: string[]) => { + if (checked) { + setSelected(newSelecteds); + return; + } + setSelected([]); + }, []); + + const onSelectRow = useCallback( + (inputValue: string) => { + const newSelected = selected.includes(inputValue) + ? selected.filter((value) => value !== inputValue) + : [...selected, inputValue]; + + setSelected(newSelected); + }, + [selected] + ); + + const onResetPage = useCallback(() => { + setPage(0); + }, []); + + const onChangePage = useCallback((event: unknown, newPage: number) => { + setPage(newPage); + }, []); + + const onChangeRowsPerPage = useCallback( + (event: React.ChangeEvent) => { + setRowsPerPage(parseInt(event.target.value, 10)); + onResetPage(); + }, + [onResetPage] + ); + + return { + page, + order, + onSort, + orderBy, + selected, + rowsPerPage, + onSelectRow, + onResetPage, + onChangePage, + onSelectAllRows, + onChangeRowsPerPage, + }; +} diff --git a/src/theme/core/components.tsx b/src/theme/core/components.tsx new file mode 100644 index 0000000..241b16a --- /dev/null +++ b/src/theme/core/components.tsx @@ -0,0 +1,171 @@ +import type { Theme, Components } from '@mui/material/styles'; + +import { varAlpha } from 'minimal-shared/utils'; + +import SvgIcon from '@mui/material/SvgIcon'; + +// ---------------------------------------------------------------------- + +const MuiBackdrop: Components['MuiBackdrop'] = { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: varAlpha(theme.vars.palette.grey['900Channel'], 0.8), + }), + invisible: { + background: 'transparent', + }, + }, +}; + +const MuiButton: Components['MuiButton'] = { + defaultProps: { + disableElevation: true, + }, + styleOverrides: { + containedInherit: ({ theme }) => ({ + color: theme.vars.palette.common.white, + backgroundColor: theme.vars.palette.grey[800], + '&:hover': { + color: theme.vars.palette.common.white, + backgroundColor: theme.vars.palette.grey[800], + }, + }), + sizeLarge: { + minHeight: 48, + }, + }, +}; + +const MuiCard: Components['MuiCard'] = { + styleOverrides: { + root: ({ theme }) => ({ + zIndex: 0, + position: 'relative', + boxShadow: theme.vars.customShadows.card, + borderRadius: theme.shape.borderRadius * 2, + }), + }, +}; + +const MuiCardHeader: Components['MuiCardHeader'] = { + defaultProps: { + titleTypographyProps: { variant: 'h6' }, + subheaderTypographyProps: { variant: 'body2' }, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(3, 3, 0), + }), + }, +}; + +const MuiOutlinedInput: Components['MuiOutlinedInput'] = { + styleOverrides: { + notchedOutline: ({ theme }) => ({ + borderColor: varAlpha(theme.vars.palette.grey['500Channel'], 0.2), + }), + }, +}; + +const MuiPaper: Components['MuiPaper'] = { + defaultProps: { elevation: 0 }, + styleOverrides: { + root: { backgroundImage: 'none' }, + outlined: ({ theme }) => ({ + borderColor: varAlpha(theme.vars.palette.grey['500Channel'], 0.16), + }), + }, +}; + +const MuiTableCell: Components['MuiTableCell'] = { + styleOverrides: { + head: ({ theme }) => ({ + fontSize: theme.typography.pxToRem(14), + color: theme.vars.palette.text.secondary, + fontWeight: theme.typography.fontWeightSemiBold, + backgroundColor: theme.vars.palette.background.neutral, + }), + }, +}; + +const MuiMenuItem: Components['MuiMenuItem'] = { + styleOverrides: { + root: ({ theme }) => ({ + ...theme.typography.body2, + }), + }, +}; + +const MuiLink: Components['MuiLink'] = { + defaultProps: { underline: 'hover' }, +}; + +const MuiFormControlLabel: Components['MuiFormControlLabel'] = { + styleOverrides: { + label: ({ theme }) => ({ + ...theme.typography.body2, + }), + }, +}; + +const MuiCheckbox: Components['MuiCheckbox'] = { + defaultProps: { + size: 'small', + icon: ( + + + + ), + checkedIcon: ( + + + + ), + indeterminateIcon: ( + + + + ), + }, +}; + +const MuiRadio: Components['MuiRadio'] = { + defaultProps: { + size: 'small', + icon: ( + + + + ), + checkedIcon: ( + + + + ), + }, +}; + +// ---------------------------------------------------------------------- + +export const components = { + MuiCard, + MuiLink, + MuiPaper, + MuiRadio, + MuiButton, + MuiBackdrop, + MuiMenuItem, + MuiCheckbox, + MuiTableCell, + MuiCardHeader, + MuiOutlinedInput, + MuiFormControlLabel, +}; diff --git a/src/theme/core/custom-shadows.ts b/src/theme/core/custom-shadows.ts new file mode 100644 index 0000000..ec3c805 --- /dev/null +++ b/src/theme/core/custom-shadows.ts @@ -0,0 +1,64 @@ +import { varAlpha } from 'minimal-shared/utils'; + +import { grey, info, error, common, primary, success, warning, secondary } from './palette'; + +import type { ThemeColorScheme } from '../types'; + +// ---------------------------------------------------------------------- + +/** + * TypeScript (type definition and extension) + * @to {@link file://./../extend-theme-types.d.ts} + */ + +export interface CustomShadows { + z1?: string; + z4?: string; + z8?: string; + z12?: string; + z16?: string; + z20?: string; + z24?: string; + primary?: string; + secondary?: string; + info?: string; + success?: string; + warning?: string; + error?: string; + card?: string; + dialog?: string; + dropdown?: string; +} + +// ---------------------------------------------------------------------- + +export function createShadowColor(colorChannel: string): string { + return `0 8px 16px 0 ${varAlpha(colorChannel, 0.24)}`; +} + +function createCustomShadows(colorChannel: string): CustomShadows { + return { + z1: `0 1px 2px 0 ${varAlpha(colorChannel, 0.16)}`, + z4: `0 4px 8px 0 ${varAlpha(colorChannel, 0.16)}`, + z8: `0 8px 16px 0 ${varAlpha(colorChannel, 0.16)}`, + z12: `0 12px 24px -4px ${varAlpha(colorChannel, 0.16)}`, + z16: `0 16px 32px -4px ${varAlpha(colorChannel, 0.16)}`, + z20: `0 20px 40px -4px ${varAlpha(colorChannel, 0.16)}`, + z24: `0 24px 48px 0 ${varAlpha(colorChannel, 0.16)}`, + /********/ + dialog: `-40px 40px 80px -8px ${varAlpha(common.blackChannel, 0.24)}`, + card: `0 0 2px 0 ${varAlpha(colorChannel, 0.2)}, 0 12px 24px -4px ${varAlpha(colorChannel, 0.12)}`, + dropdown: `0 0 2px 0 ${varAlpha(colorChannel, 0.24)}, -20px 20px 40px -4px ${varAlpha(colorChannel, 0.24)}`, + /********/ + primary: createShadowColor(primary.mainChannel), + secondary: createShadowColor(secondary.mainChannel), + info: createShadowColor(info.mainChannel), + success: createShadowColor(success.mainChannel), + warning: createShadowColor(warning.mainChannel), + error: createShadowColor(error.mainChannel), + }; +} + +export const customShadows: Partial> = { + light: createCustomShadows(grey['500Channel']), +}; diff --git a/src/theme/core/index.ts b/src/theme/core/index.ts new file mode 100644 index 0000000..1f6edd4 --- /dev/null +++ b/src/theme/core/index.ts @@ -0,0 +1,9 @@ +export * from './shadows'; + +export * from './palette'; + +export * from './typography'; + +export * from './components'; + +export * from './custom-shadows'; diff --git a/src/theme/core/palette.ts b/src/theme/core/palette.ts new file mode 100644 index 0000000..c5424f0 --- /dev/null +++ b/src/theme/core/palette.ts @@ -0,0 +1,146 @@ +import type { PaletteColor, ColorSystemOptions, PaletteColorChannel } from '@mui/material/styles'; + +import { varAlpha, createPaletteChannel } from 'minimal-shared/utils'; + +import { themeConfig } from '../theme-config'; + +import type { ThemeColorScheme } from '../types'; + +// ---------------------------------------------------------------------- + +/** + * TypeScript (type definition and extension) + * @to {@link file://./../extend-theme-types.d.ts} + */ + +// Keys for the palette colors +export type PaletteColorKey = 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'; + +// Palette color without additional channels +export type PaletteColorNoChannels = Omit; + +// Palette color with additional channels +export type PaletteColorWithChannels = PaletteColor & PaletteColorChannel; + +// Extended common colors +export type CommonColorsExtend = { + whiteChannel: string; + blackChannel: string; +}; + +// Extended text colors +export type TypeTextExtend = { + disabledChannel: string; +}; + +// Extended background colors +export type TypeBackgroundExtend = { + neutral: string; + neutralChannel: string; +}; + +// Extended palette colors +export type PaletteColorExtend = { + lighter: string; + darker: string; + lighterChannel: string; + darkerChannel: string; +}; + +// Extended grey channels +export type GreyExtend = { + '50Channel': string; + '100Channel': string; + '200Channel': string; + '300Channel': string; + '400Channel': string; + '500Channel': string; + '600Channel': string; + '700Channel': string; + '800Channel': string; + '900Channel': string; +}; + +// ---------------------------------------------------------------------- + +// Primary color +export const primary = createPaletteChannel(themeConfig.palette.primary); + +// Secondary color +export const secondary = createPaletteChannel(themeConfig.palette.secondary); + +// Info color +export const info = createPaletteChannel(themeConfig.palette.info); + +// Success color +export const success = createPaletteChannel(themeConfig.palette.success); + +// Warning color +export const warning = createPaletteChannel(themeConfig.palette.warning); + +// Error color +export const error = createPaletteChannel(themeConfig.palette.error); + +// Common color +export const common = createPaletteChannel(themeConfig.palette.common); + +// Grey color +export const grey = createPaletteChannel(themeConfig.palette.grey); + +// Text color +export const text = { + light: createPaletteChannel({ + primary: grey[800], + secondary: grey[600], + disabled: grey[500], + }), +}; + +// Background color +export const background = { + light: createPaletteChannel({ + paper: '#FFFFFF', + default: grey[100], + neutral: grey[200], + }), +}; + +// Base action color +export const baseAction = { + hover: varAlpha(grey['500Channel'], 0.08), + selected: varAlpha(grey['500Channel'], 0.16), + focus: varAlpha(grey['500Channel'], 0.24), + disabled: varAlpha(grey['500Channel'], 0.8), + disabledBackground: varAlpha(grey['500Channel'], 0.24), + hoverOpacity: 0.08, + disabledOpacity: 0.48, +}; + +// Action color +export const action = { + light: { ...baseAction, active: grey[600] }, +}; + +// ---------------------------------------------------------------------- + +// Base palette +export const basePalette = { + primary, + secondary, + info, + success, + warning, + error, + common, + grey, + divider: varAlpha(grey['500Channel'], 0.2), +}; + +export const palette: Partial> = { + light: { + ...basePalette, + text: text.light, + background: background.light, + action: action.light, + }, +}; diff --git a/src/theme/core/shadows.ts b/src/theme/core/shadows.ts new file mode 100644 index 0000000..4d1659a --- /dev/null +++ b/src/theme/core/shadows.ts @@ -0,0 +1,47 @@ +import type { Shadows } from '@mui/material/styles'; + +import { varAlpha } from 'minimal-shared/utils'; + +import { grey } from './palette'; + +import type { ThemeColorScheme } from '../types'; + +// ---------------------------------------------------------------------- + +function createShadows(colorChannel: string): Shadows { + const color1 = varAlpha(colorChannel, 0.2); + const color2 = varAlpha(colorChannel, 0.14); + const color3 = varAlpha(colorChannel, 0.12); + + return [ + 'none', + `0px 2px 1px -1px ${color1},0px 1px 1px 0px ${color2},0px 1px 3px 0px ${color3}`, + `0px 3px 1px -2px ${color1},0px 2px 2px 0px ${color2},0px 1px 5px 0px ${color3}`, + `0px 3px 3px -2px ${color1},0px 3px 4px 0px ${color2},0px 1px 8px 0px ${color3}`, + `0px 2px 4px -1px ${color1},0px 4px 5px 0px ${color2},0px 1px 10px 0px ${color3}`, + `0px 3px 5px -1px ${color1},0px 5px 8px 0px ${color2},0px 1px 14px 0px ${color3}`, + `0px 3px 5px -1px ${color1},0px 6px 10px 0px ${color2},0px 1px 18px 0px ${color3}`, + `0px 4px 5px -2px ${color1},0px 7px 10px 1px ${color2},0px 2px 16px 1px ${color3}`, + `0px 5px 5px -3px ${color1},0px 8px 10px 1px ${color2},0px 3px 14px 2px ${color3}`, + `0px 5px 6px -3px ${color1},0px 9px 12px 1px ${color2},0px 3px 16px 2px ${color3}`, + `0px 6px 6px -3px ${color1},0px 10px 14px 1px ${color2},0px 4px 18px 3px ${color3}`, + `0px 6px 7px -4px ${color1},0px 11px 15px 1px ${color2},0px 4px 20px 3px ${color3}`, + `0px 7px 8px -4px ${color1},0px 12px 17px 2px ${color2},0px 5px 22px 4px ${color3}`, + `0px 7px 8px -4px ${color1},0px 13px 19px 2px ${color2},0px 5px 24px 4px ${color3}`, + `0px 7px 9px -4px ${color1},0px 14px 21px 2px ${color2},0px 5px 26px 4px ${color3}`, + `0px 8px 9px -5px ${color1},0px 15px 22px 2px ${color2},0px 6px 28px 5px ${color3}`, + `0px 8px 10px -5px ${color1},0px 16px 24px 2px ${color2},0px 6px 30px 5px ${color3}`, + `0px 8px 11px -5px ${color1},0px 17px 26px 2px ${color2},0px 6px 32px 5px ${color3}`, + `0px 9px 11px -5px ${color1},0px 18px 28px 2px ${color2},0px 7px 34px 6px ${color3}`, + `0px 9px 12px -6px ${color1},0px 19px 29px 2px ${color2},0px 7px 36px 6px ${color3}`, + `0px 10px 13px -6px ${color1},0px 20px 31px 3px ${color2},0px 8px 38px 7px ${color3}`, + `0px 10px 13px -6px ${color1},0px 21px 33px 3px ${color2},0px 8px 40px 7px ${color3}`, + `0px 10px 14px -6px ${color1},0px 22px 35px 3px ${color2},0px 8px 42px 7px ${color3}`, + `0px 11px 14px -7px ${color1},0px 23px 36px 3px ${color2},0px 9px 44px 8px ${color3}`, + `0px 11px 15px -7px ${color1},0px 24px 38px 3px ${color2},0px 9px 46px 8px ${color3}`, + ]; +} + +export const shadows: Partial> = { + light: createShadows(grey['500Channel']), +}; diff --git a/src/theme/core/typography.ts b/src/theme/core/typography.ts new file mode 100644 index 0000000..302dfc8 --- /dev/null +++ b/src/theme/core/typography.ts @@ -0,0 +1,127 @@ +import type { CSSObject, Breakpoint, TypographyVariantsOptions } from '@mui/material/styles'; + +import { pxToRem, setFont } from 'minimal-shared/utils'; + +import { createTheme as getTheme } from '@mui/material/styles'; + +import { themeConfig } from '../theme-config'; + +// ---------------------------------------------------------------------- + +/** + * TypeScript (type definition and extension) + * @to {@link file://./../extend-theme-types.d.ts} + */ +export type FontStyleExtend = { + fontWeightSemiBold: CSSObject['fontWeight']; + fontSecondaryFamily: CSSObject['fontFamily']; +}; + +export type ResponsiveFontSizesInput = Partial>; +export type ResponsiveFontSizesResult = Record; + +const defaultMuiTheme = getTheme(); + +function responsiveFontSizes(obj: ResponsiveFontSizesInput): ResponsiveFontSizesResult { + const breakpoints: Breakpoint[] = defaultMuiTheme.breakpoints.keys; + + return breakpoints.reduce((acc, breakpoint) => { + const value = obj[breakpoint]; + + if (value !== undefined && value >= 0) { + acc[defaultMuiTheme.breakpoints.up(breakpoint)] = { + fontSize: pxToRem(value), + }; + } + + return acc; + }, {} as ResponsiveFontSizesResult); +} + +// ---------------------------------------------------------------------- + +const primaryFont = setFont(themeConfig.fontFamily.primary); +const secondaryFont = setFont(themeConfig.fontFamily.secondary); + +export const typography: TypographyVariantsOptions = { + fontFamily: primaryFont, + fontSecondaryFamily: secondaryFont, + fontWeightLight: '300', + fontWeightRegular: '400', + fontWeightMedium: '500', + fontWeightSemiBold: '600', + fontWeightBold: '700', + h1: { + fontFamily: secondaryFont, + fontWeight: 800, + lineHeight: 80 / 64, + fontSize: pxToRem(40), + ...responsiveFontSizes({ sm: 52, md: 58, lg: 64 }), + }, + h2: { + fontFamily: secondaryFont, + fontWeight: 800, + lineHeight: 64 / 48, + fontSize: pxToRem(32), + ...responsiveFontSizes({ sm: 40, md: 44, lg: 48 }), + }, + h3: { + fontFamily: secondaryFont, + fontWeight: 700, + lineHeight: 1.5, + fontSize: pxToRem(24), + ...responsiveFontSizes({ sm: 26, md: 30, lg: 32 }), + }, + h4: { + fontWeight: 700, + lineHeight: 1.5, + fontSize: pxToRem(20), + ...responsiveFontSizes({ md: 24 }), + }, + h5: { + fontWeight: 700, + lineHeight: 1.5, + fontSize: pxToRem(18), + ...responsiveFontSizes({ sm: 19 }), + }, + h6: { + fontWeight: 600, + lineHeight: 28 / 18, + fontSize: pxToRem(17), + ...responsiveFontSizes({ sm: 18 }), + }, + subtitle1: { + fontWeight: 600, + lineHeight: 1.5, + fontSize: pxToRem(16), + }, + subtitle2: { + fontWeight: 600, + lineHeight: 22 / 14, + fontSize: pxToRem(14), + }, + body1: { + lineHeight: 1.5, + fontSize: pxToRem(16), + }, + body2: { + lineHeight: 22 / 14, + fontSize: pxToRem(14), + }, + caption: { + lineHeight: 1.5, + fontSize: pxToRem(12), + }, + overline: { + fontWeight: 700, + lineHeight: 1.5, + fontSize: pxToRem(12), + textTransform: 'uppercase', + }, + button: { + fontWeight: 700, + lineHeight: 24 / 14, + fontSize: pxToRem(14), + textTransform: 'unset', + }, +}; diff --git a/src/theme/create-classes.ts b/src/theme/create-classes.ts new file mode 100644 index 0000000..977771a --- /dev/null +++ b/src/theme/create-classes.ts @@ -0,0 +1,7 @@ +import { themeConfig } from './theme-config'; + +// ---------------------------------------------------------------------- + +export function createClasses(className: string): string { + return `${themeConfig.classesPrefix}__${className}`; +} diff --git a/src/theme/create-theme.ts b/src/theme/create-theme.ts new file mode 100644 index 0000000..70bee61 --- /dev/null +++ b/src/theme/create-theme.ts @@ -0,0 +1,40 @@ +import type { Theme } from '@mui/material/styles'; + +import { createTheme as createMuiTheme } from '@mui/material/styles'; + +import { shadows } from './core/shadows'; +import { palette } from './core/palette'; +import { themeConfig } from './theme-config'; +import { components } from './core/components'; +import { typography } from './core/typography'; +import { customShadows } from './core/custom-shadows'; + +import type { ThemeOptions } from './types'; + +// ---------------------------------------------------------------------- + +export const baseTheme: ThemeOptions = { + colorSchemes: { + light: { + palette: palette.light, + shadows: shadows.light, + customShadows: customShadows.light, + }, + }, + components, + typography, + shape: { borderRadius: 8 }, + cssVariables: themeConfig.cssVariables, +}; + +// ---------------------------------------------------------------------- + +type CreateThemeProps = { + themeOverrides?: ThemeOptions; +}; + +export function createTheme({ themeOverrides = {} }: CreateThemeProps = {}): Theme { + const theme = createMuiTheme(baseTheme, themeOverrides); + + return theme; +} diff --git a/src/theme/extend-theme-types.d.ts b/src/theme/extend-theme-types.d.ts new file mode 100644 index 0000000..42b84e1 --- /dev/null +++ b/src/theme/extend-theme-types.d.ts @@ -0,0 +1,66 @@ +import type {} from '@mui/lab/themeAugmentation'; +import type {} from '@mui/material/themeCssVarsAugmentation'; + +import type { FontStyleExtend } from './core/typography'; +import type { CustomShadows } from './core/custom-shadows'; +import type { + GreyExtend, + TypeTextExtend, + CommonColorsExtend, + PaletteColorExtend, + TypeBackgroundExtend, +} from './core/palette'; + +// ---------------------------------------------------------------------- + +/** ************************************** + * EXTEND CORE + * Palette, typography, shadows... + *************************************** */ + +/** + * Palette + * https://mui.com/customization/palette/ + * @from {@link file://./core/palette.ts} + */ +declare module '@mui/material/styles' { + // grey + interface Color extends GreyExtend {} + // text + interface TypeText extends TypeTextExtend {} + // black & white + interface CommonColors extends CommonColorsExtend {} + // background + interface TypeBackground extends TypeBackgroundExtend {} + // primary, secondary, info, success, warning, error + interface PaletteColor extends PaletteColorExtend {} + interface SimplePaletteColorOptions extends Partial {} +} + +/** + * Typography + * https://mui.com/customization/typography/ + * @from {@link file://./core/typography.ts} + */ +declare module '@mui/material/styles' { + interface TypographyVariants extends FontStyleExtend {} + interface TypographyVariantsOptions extends Partial {} +} + +declare module '@mui/material/styles' { + /** + * Custom shadows + * @from {@link file://./core/custom-shadows.ts} + */ + interface Theme { + customShadows: CustomShadows; + } + interface ThemeOptions { + customShadows?: CustomShadows; + } + interface ThemeVars { + customShadows: CustomShadows; + typography: Theme['typography']; + transitions: Theme['transitions']; + } +} diff --git a/src/theme/index.ts b/src/theme/index.ts new file mode 100644 index 0000000..26e759f --- /dev/null +++ b/src/theme/index.ts @@ -0,0 +1,7 @@ +export * from './core'; + +export * from './types'; + +export * from './theme-config'; + +export * from './theme-provider'; diff --git a/src/theme/theme-config.ts b/src/theme/theme-config.ts new file mode 100644 index 0000000..8805602 --- /dev/null +++ b/src/theme/theme-config.ts @@ -0,0 +1,109 @@ +import type { CommonColors } from '@mui/material/styles'; + +import type { ThemeCssVariables } from './types'; +import type { PaletteColorNoChannels } from './core/palette'; + +// ---------------------------------------------------------------------- + +type ThemeConfig = { + classesPrefix: string; + cssVariables: ThemeCssVariables; + fontFamily: Record<'primary' | 'secondary', string>; + palette: Record< + 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error', + PaletteColorNoChannels + > & { + common: Pick; + grey: Record< + '50' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900', + string + >; + }; +}; + +export const themeConfig: ThemeConfig = { + /** ************************************** + * Base + *************************************** */ + classesPrefix: 'minimal', + /** ************************************** + * Typography + *************************************** */ + fontFamily: { + primary: 'DM Sans Variable', + secondary: 'Barlow', + }, + /** ************************************** + * Palette + *************************************** */ + palette: { + primary: { + lighter: '#D0ECFE', + light: '#73BAFB', + main: '#1877F2', + dark: '#0C44AE', + darker: '#042174', + contrastText: '#FFFFFF', + }, + secondary: { + lighter: '#EFD6FF', + light: '#C684FF', + main: '#8E33FF', + dark: '#5119B7', + darker: '#27097A', + contrastText: '#FFFFFF', + }, + info: { + lighter: '#CAFDF5', + light: '#61F3F3', + main: '#00B8D9', + dark: '#006C9C', + darker: '#003768', + contrastText: '#FFFFFF', + }, + success: { + lighter: '#D3FCD2', + light: '#77ED8B', + main: '#22C55E', + dark: '#118D57', + darker: '#065E49', + contrastText: '#ffffff', + }, + warning: { + lighter: '#FFF5CC', + light: '#FFD666', + main: '#FFAB00', + dark: '#B76E00', + darker: '#7A4100', + contrastText: '#1C252E', + }, + error: { + lighter: '#FFE9D5', + light: '#FFAC82', + main: '#FF5630', + dark: '#B71D18', + darker: '#7A0916', + contrastText: '#FFFFFF', + }, + grey: { + '50': '#FCFDFD', + '100': '#F9FAFB', + '200': '#F4F6F8', + '300': '#DFE3E8', + '400': '#C4CDD5', + '500': '#919EAB', + '600': '#637381', + '700': '#454F5B', + '800': '#1C252E', + '900': '#141A21', + }, + common: { black: '#000000', white: '#FFFFFF' }, + }, + /** ************************************** + * Css variables + *************************************** */ + cssVariables: { + cssVarPrefix: '', + colorSchemeSelector: 'data-color-scheme', + }, +}; diff --git a/src/theme/theme-provider.tsx b/src/theme/theme-provider.tsx new file mode 100644 index 0000000..8b8de27 --- /dev/null +++ b/src/theme/theme-provider.tsx @@ -0,0 +1,28 @@ +import type { ThemeProviderProps as MuiThemeProviderProps } from '@mui/material/styles'; + +import CssBaseline from '@mui/material/CssBaseline'; +import { ThemeProvider as ThemeVarsProvider } from '@mui/material/styles'; + +import { createTheme } from './create-theme'; + +import type {} from './extend-theme-types'; +import type { ThemeOptions } from './types'; + +// ---------------------------------------------------------------------- + +export type ThemeProviderProps = Partial & { + themeOverrides?: ThemeOptions; +}; + +export function ThemeProvider({ themeOverrides, children, ...other }: ThemeProviderProps) { + const theme = createTheme({ + themeOverrides, + }); + + return ( + + + {children} + + ); +} diff --git a/src/theme/types.ts b/src/theme/types.ts new file mode 100644 index 0000000..d3f28ad --- /dev/null +++ b/src/theme/types.ts @@ -0,0 +1,35 @@ +import type { + Shadows, + ColorSystemOptions, + CssVarsThemeOptions, + SupportedColorScheme, + ThemeOptions as MuiThemeOptions, +} from '@mui/material/styles'; + +import type { CustomShadows } from './core/custom-shadows'; + +// ---------------------------------------------------------------------- + +/** + * Theme options + * Extended type that includes additional properties for color schemes and CSS variables. + * + * @see https://github.com/mui/material-ui/blob/master/packages/mui-material/src/styles/createTheme.ts + */ + +export type ThemeColorScheme = SupportedColorScheme; +export type ThemeCssVariables = Pick< + CssVarsThemeOptions, + 'colorSchemeSelector' | 'disableCssColorScheme' | 'cssVarPrefix' | 'shouldSkipGeneratingVar' +>; + +type ColorSchemeOptionsExtended = ColorSystemOptions & { + shadows?: Shadows; + customShadows?: CustomShadows; +}; + +export type ThemeOptions = Omit & + Pick & { + colorSchemes?: Partial>; + cssVariables?: ThemeCssVariables; + }; diff --git a/src/utils/format-number.ts b/src/utils/format-number.ts new file mode 100644 index 0000000..33203ac --- /dev/null +++ b/src/utils/format-number.ts @@ -0,0 +1,86 @@ +/* + * Locales code + * https://gist.github.com/raushankrjha/d1c7e35cf87e69aa8b4208a8171a8416 + */ + +export type InputNumberValue = string | number | null | undefined; + +type Options = Intl.NumberFormatOptions; + +const DEFAULT_LOCALE = { code: 'en-US', currency: 'USD' }; + +function processInput(inputValue: InputNumberValue): number | null { + if (inputValue == null || Number.isNaN(inputValue)) return null; + return Number(inputValue); +} + +// ---------------------------------------------------------------------- + +export function fNumber(inputValue: InputNumberValue, options?: Options) { + const locale = DEFAULT_LOCALE; + + const number = processInput(inputValue); + if (number === null) return ''; + + const fm = new Intl.NumberFormat(locale.code, { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + ...options, + }).format(number); + + return fm; +} + +// ---------------------------------------------------------------------- + +export function fCurrency(inputValue: InputNumberValue, options?: Options) { + const locale = DEFAULT_LOCALE; + + const number = processInput(inputValue); + if (number === null) return ''; + + const fm = new Intl.NumberFormat(locale.code, { + style: 'currency', + currency: locale.currency, + minimumFractionDigits: 0, + maximumFractionDigits: 2, + ...options, + }).format(number); + + return fm; +} + +// ---------------------------------------------------------------------- + +export function fPercent(inputValue: InputNumberValue, options?: Options) { + const locale = DEFAULT_LOCALE; + + const number = processInput(inputValue); + if (number === null) return ''; + + const fm = new Intl.NumberFormat(locale.code, { + style: 'percent', + minimumFractionDigits: 0, + maximumFractionDigits: 1, + ...options, + }).format(number / 100); + + return fm; +} + +// ---------------------------------------------------------------------- + +export function fShortenNumber(inputValue: InputNumberValue, options?: Options) { + const locale = DEFAULT_LOCALE; + + const number = processInput(inputValue); + if (number === null) return ''; + + const fm = new Intl.NumberFormat(locale.code, { + notation: 'compact', + maximumFractionDigits: 2, + ...options, + }).format(number); + + return fm.replace(/[A-Z]/g, (match) => match.toLowerCase()); +} diff --git a/src/utils/format-time.ts b/src/utils/format-time.ts new file mode 100644 index 0000000..71f1bc0 --- /dev/null +++ b/src/utils/format-time.ts @@ -0,0 +1,92 @@ +import type { Dayjs } from 'dayjs'; + +import dayjs from 'dayjs'; +import duration from 'dayjs/plugin/duration'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +// ---------------------------------------------------------------------- + +/** + * @Docs + * https://day.js.org/docs/en/display/format + */ + +/** + * Default timezones + * https://day.js.org/docs/en/timezone/set-default-timezone#docsNav + * + */ + +/** + * UTC + * https://day.js.org/docs/en/plugin/utc + * @install + * import utc from 'dayjs/plugin/utc'; + * dayjs.extend(utc); + * @usage + * dayjs().utc().format() + * + */ + +dayjs.extend(duration); +dayjs.extend(relativeTime); + +// ---------------------------------------------------------------------- + +export type DatePickerFormat = Dayjs | Date | string | number | null | undefined; + +export const formatPatterns = { + dateTime: 'DD MMM YYYY h:mm a', // 17 Apr 2022 12:00 am + date: 'DD MMM YYYY', // 17 Apr 2022 + time: 'h:mm a', // 12:00 am + split: { + dateTime: 'DD/MM/YYYY h:mm a', // 17/04/2022 12:00 am + date: 'DD/MM/YYYY', // 17/04/2022 + }, + paramCase: { + dateTime: 'DD-MM-YYYY h:mm a', // 17-04-2022 12:00 am + date: 'DD-MM-YYYY', // 17-04-2022 + }, +}; + +const isValidDate = (date: DatePickerFormat) => + date !== null && date !== undefined && dayjs(date).isValid(); + +// ---------------------------------------------------------------------- + +/** + * @output 17 Apr 2022 12:00 am + */ +export function fDateTime(date: DatePickerFormat, template?: string): string { + if (!isValidDate(date)) { + return 'Invalid date'; + } + + return dayjs(date).format(template ?? formatPatterns.dateTime); +} + +// ---------------------------------------------------------------------- + +/** + * @output 17 Apr 2022 + */ +export function fDate(date: DatePickerFormat, template?: string): string { + if (!isValidDate(date)) { + return 'Invalid date'; + } + + return dayjs(date).format(template ?? formatPatterns.date); +} + +// ---------------------------------------------------------------------- + +/** + * @output a few seconds, 2 years + */ +export function fToNow(date: DatePickerFormat): string { + if (!isValidDate(date)) { + return 'Invalid date'; + } + + return dayjs(date).toNow(true); +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..019f239 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + /* Bundler */ + "baseUrl": ".", + "module": "ESNext", + "jsx": "react-jsx", + "allowJs": true, + "resolveJsonModule": true, + + /* Build */ + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "moduleResolution": "bundler", + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "incremental": true, + "skipLibCheck": true, + "esModuleInterop": true, + "isolatedModules": true, + + /* Linting */ + "strict": true, + "noEmit": true, + "strictNullChecks": true + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..a535f7d --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..37026a7 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,36 @@ +import path from 'path'; +import checker from 'vite-plugin-checker'; +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +// ---------------------------------------------------------------------- + +const PORT = 3039; + +export default defineConfig({ + plugins: [ + react(), + checker({ + typescript: true, + eslint: { + useFlatConfig: true, + lintCommand: 'eslint "./src/**/*.{js,jsx,ts,tsx}"', + dev: { logLevel: ['error'] }, + }, + overlay: { + position: 'tl', + initialIsOpen: false, + }, + }), + ], + resolve: { + alias: [ + { + find: /^src(.+)/, + replacement: path.resolve(process.cwd(), 'src/$1'), + }, + ], + }, + server: { port: PORT, host: true }, + preview: { port: PORT, host: true }, +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fb0de90 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2969 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/generator@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz" + integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== + dependencies: + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-module-imports@^7.16.7": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/parser@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== + dependencies: + "@babel/types" "^7.27.0" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.26.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz" + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + +"@babel/traverse@^7.25.9": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz" + integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.27.0" + "@babel/parser" "^7.27.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.25.9", "@babel/types@^7.27.0": + version "7.27.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz" + integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@emotion/babel-plugin@^11.13.5": + 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== + 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" + +"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": + 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== + 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": + version "0.9.2" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@emotion/is-prop-valid@^1.3.0": + 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== + dependencies: + "@emotion/memoize" "^0.9.0" + +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.14.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0": + version "11.14.0" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== + 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" + +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== + 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" + +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== + +"@emotion/styled@^11.14.0", "@emotion/styled@^11.3.0": + version "11.14.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz" + integrity sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA== + 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" + +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + 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== + +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== + +"@emotion/weak-memoize@^0.4.0": + 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== + +"@esbuild/win32-x64@0.25.2": + version "0.25.2" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz" + integrity sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz" + integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.2": + version "0.19.2" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz" + integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.0": + version "0.2.1" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz" + integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw== + +"@eslint/core@^0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz" + integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/core@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz" + integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.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" + +"@eslint/js@^9.23.0", "@eslint/js@9.23.0": + version "9.23.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz" + integrity sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.7": + version "0.2.8" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz" + integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== + dependencies: + "@eslint/core" "^0.13.0" + levn "^0.4.1" + +"@fontsource-variable/dm-sans@^5.2.5": + version "5.2.5" + resolved "https://registry.npmjs.org/@fontsource-variable/dm-sans/-/dm-sans-5.2.5.tgz" + integrity sha512-ynWdb1Ncn5ywUOE6OkTsvgjkiZKj+xM/GS2iVE47MBvS3AlfOSyOy3xynfkQsM3ngaxdCamT/06hZGAgPmao0A== + +"@fontsource/barlow@^5.2.5": + version "5.2.5" + resolved "https://registry.npmjs.org/@fontsource/barlow/-/barlow-5.2.5.tgz" + integrity sha512-p+2XXEM7v85kbn0Dh8g0YLMjTCDiRCAi9nHik6w/2owZ9CkT1yYGGgaUMshJRqykh7efv1gE0QxAkOhZHd8tEg== + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + +"@iconify/react@^5.2.1": + version "5.2.1" + resolved "https://registry.npmjs.org/@iconify/react/-/react-5.2.1.tgz" + integrity sha512-37GDR3fYDZmnmUn9RagyaX+zca24jfVOMY8E1IXTqJuE8pxNtN51KWPQe3VODOWvuUurq7q9uUu3CFrpqj5Iqg== + dependencies: + "@iconify/types" "^2.0.0" + +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mui/core-downloads-tracker@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.1.tgz" + integrity sha512-T5DNVnSD9pMbj4Jk/Uphz+yvj9dfpl2+EqsOuJtG12HxEihNG5pd3qzX5yM1Id4dDwKRvM3dPVcxyzavTFhJeA== + +"@mui/lab@^7.0.0-beta.10": + version "7.0.0-beta.10" + resolved "https://registry.npmjs.org/@mui/lab/-/lab-7.0.0-beta.10.tgz" + integrity sha512-ide9oABYRAvJAFtxjc+bAaeAR74yVZ4avV7Ffj/D5CbbgSp/d5ns9SQtuWIZ7oJ3S7l1fcR06dj8EZuPRTmo8A== + dependencies: + "@babel/runtime" "^7.26.10" + "@mui/system" "^7.0.1" + "@mui/types" "^7.4.0" + "@mui/utils" "^7.0.1" + clsx "^2.1.1" + prop-types "^15.8.1" + +"@mui/material@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/material/-/material-7.0.1.tgz" + integrity sha512-tQwjIIsn/UUSCHoCIQVkANuLua67h7Ro9M9gIHoGWaFbJFuF6cSO4Oda2olDVqIs4SWG+PaDChuu6SngxsaoyQ== + dependencies: + "@babel/runtime" "^7.26.10" + "@mui/core-downloads-tracker" "^7.0.1" + "@mui/system" "^7.0.1" + "@mui/types" "^7.4.0" + "@mui/utils" "^7.0.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" + +"@mui/private-theming@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz" + integrity sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ== + dependencies: + "@babel/runtime" "^7.26.10" + "@mui/utils" "^7.0.1" + prop-types "^15.8.1" + +"@mui/styled-engine@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz" + integrity sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ== + dependencies: + "@babel/runtime" "^7.26.10" + "@emotion/cache" "^11.13.5" + "@emotion/serialize" "^1.3.3" + "@emotion/sheet" "^1.4.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/system@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz" + integrity sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA== + dependencies: + "@babel/runtime" "^7.26.10" + "@mui/private-theming" "^7.0.1" + "@mui/styled-engine" "^7.0.1" + "@mui/types" "^7.4.0" + "@mui/utils" "^7.0.1" + clsx "^2.1.1" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/types@^7.4.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz" + integrity sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ== + dependencies: + "@babel/runtime" "^7.26.10" + +"@mui/utils@^7.0.1": + version "7.0.1" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz" + integrity sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g== + dependencies: + "@babel/runtime" "^7.26.10" + "@mui/types" "^7.4.0" + "@types/prop-types" "^15.7.14" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^19.0.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@rollup/rollup-win32-x64-msvc@4.39.0": + version "4.39.0" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz" + integrity sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@svgdotjs/svg.draggable.js@^3.0.4": + version "3.0.6" + resolved "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz" + integrity sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA== + +"@svgdotjs/svg.filter.js@^3.0.8": + version "3.0.9" + resolved "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz" + integrity sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw== + dependencies: + "@svgdotjs/svg.js" "^3.2.4" + +"@svgdotjs/svg.js@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz" + integrity sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg== + +"@svgdotjs/svg.resize.js@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz" + integrity sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA== + +"@svgdotjs/svg.select.js@^4.0.1": + version "4.0.2" + resolved "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz" + integrity sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g== + +"@swc/core-win32-x64-msvc@1.11.16": + version "1.11.16" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.16.tgz" + integrity sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ== + +"@swc/core@^1.11.11": + version "1.11.16" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.11.16.tgz" + integrity sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.21" + optionalDependencies: + "@swc/core-darwin-arm64" "1.11.16" + "@swc/core-darwin-x64" "1.11.16" + "@swc/core-linux-arm-gnueabihf" "1.11.16" + "@swc/core-linux-arm64-gnu" "1.11.16" + "@swc/core-linux-arm64-musl" "1.11.16" + "@swc/core-linux-x64-gnu" "1.11.16" + "@swc/core-linux-x64-musl" "1.11.16" + "@swc/core-win32-arm64-msvc" "1.11.16" + "@swc/core-win32-ia32-msvc" "1.11.16" + "@swc/core-win32-x64-msvc" "1.11.16" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/types@^0.1.21": + version "0.1.21" + resolved "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz" + integrity sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ== + dependencies: + "@swc/counter" "^0.1.3" + +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + +"@types/estree@^1.0.6", "@types/estree@1.0.7": + version "1.0.7" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^22.14.0": + version "22.14.0" + resolved "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz" + integrity sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA== + dependencies: + undici-types "~6.21.0" + +"@types/parse-json@^4.0.0": + 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== + +"@types/prop-types@^15.7.14": + version "15.7.14" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== + +"@types/react-dom@^19.1.1": + version "19.1.1" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz" + integrity sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w== + +"@types/react-transition-group@^4.4.12": + 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== + +"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^19.0.0", "@types/react@^19.1.0": + version "19.1.0" + resolved "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz" + integrity sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w== + dependencies: + csstype "^3.0.2" + +"@typescript-eslint/eslint-plugin@^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz" + integrity sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.29.0" + "@typescript-eslint/type-utils" "8.29.0" + "@typescript-eslint/utils" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@^8.29.0", "@typescript-eslint/parser@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz" + integrity sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g== + dependencies: + "@typescript-eslint/scope-manager" "8.29.0" + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/typescript-estree" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz" + integrity sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw== + dependencies: + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + +"@typescript-eslint/type-utils@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz" + integrity sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q== + dependencies: + "@typescript-eslint/typescript-estree" "8.29.0" + "@typescript-eslint/utils" "8.29.0" + debug "^4.3.4" + ts-api-utils "^2.0.1" + +"@typescript-eslint/types@^8.29.0", "@typescript-eslint/types@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz" + integrity sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg== + +"@typescript-eslint/typescript-estree@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz" + integrity sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow== + dependencies: + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/utils@^8.29.0", "@typescript-eslint/utils@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz" + integrity sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.29.0" + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/typescript-estree" "8.29.0" + +"@typescript-eslint/visitor-keys@8.29.0": + version "8.29.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz" + integrity sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg== + dependencies: + "@typescript-eslint/types" "8.29.0" + eslint-visitor-keys "^4.2.0" + +"@unrs/resolver-binding-win32-x64-msvc@1.3.3": + version "1.3.3" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.3.tgz" + integrity sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w== + +"@vitejs/plugin-react-swc@^3.8.1": + version "3.8.1" + resolved "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.8.1.tgz" + integrity sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A== + dependencies: + "@swc/core" "^1.11.11" + +"@yr/monotone-cubic-spline@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz" + integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: + version "8.14.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +apexcharts@^4.5.0, apexcharts@>=4.0.0: + version "4.5.0" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-4.5.0.tgz" + integrity sha512-E7ZkrVqPNBUWy/Rmg8DEIqHNBmElzICE/oxOX5Ekvs2ICQUOK/VkEkMH09JGJu+O/EA0NL31hxlmF+wrwrSLaQ== + dependencies: + "@svgdotjs/svg.draggable.js" "^3.0.4" + "@svgdotjs/svg.filter.js" "^3.0.8" + "@svgdotjs/svg.js" "^3.2.4" + "@svgdotjs/svg.resize.js" "^2.0.2" + "@svgdotjs/svg.select.js" "^4.0.1" + "@yr/monotone-cubic-spline" "^1.0.3" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + 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== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array.prototype.findlast@^1.2.5: + 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== + 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" + +array.prototype.findlastindex@^1.2.5: + 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== + 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" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.3" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + 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" + +arraybuffer.prototype.slice@^1.0.4: + 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== + 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" + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +available-typed-arrays@^1.0.7: + 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== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + 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== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + 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" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.5.0: + 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== + +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2, csstype@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + 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== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + 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== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dayjs@^1.11.13: + version "1.11.13" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + 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== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + 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== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + 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.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + 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-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" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.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.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.2.1: + 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== + 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" + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + 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== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + 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== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + 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== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es-toolkit@^1.32.0, es-toolkit@^1.34.1: + version "1.34.1" + resolved "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.34.1.tgz" + integrity sha512-OA6cd94fJV9bm8dWhIySkWq4xV+rAQnBZUr2dnpXam0QJ8c+hurLbKA8/QooL9Mx4WCAxvIDsiEkid5KPQ5xgQ== + +esbuild@^0.25.0: + version "0.25.2" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz" + integrity sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.2" + "@esbuild/android-arm" "0.25.2" + "@esbuild/android-arm64" "0.25.2" + "@esbuild/android-x64" "0.25.2" + "@esbuild/darwin-arm64" "0.25.2" + "@esbuild/darwin-x64" "0.25.2" + "@esbuild/freebsd-arm64" "0.25.2" + "@esbuild/freebsd-x64" "0.25.2" + "@esbuild/linux-arm" "0.25.2" + "@esbuild/linux-arm64" "0.25.2" + "@esbuild/linux-ia32" "0.25.2" + "@esbuild/linux-loong64" "0.25.2" + "@esbuild/linux-mips64el" "0.25.2" + "@esbuild/linux-ppc64" "0.25.2" + "@esbuild/linux-riscv64" "0.25.2" + "@esbuild/linux-s390x" "0.25.2" + "@esbuild/linux-x64" "0.25.2" + "@esbuild/netbsd-arm64" "0.25.2" + "@esbuild/netbsd-x64" "0.25.2" + "@esbuild/openbsd-arm64" "0.25.2" + "@esbuild/openbsd-x64" "0.25.2" + "@esbuild/sunos-x64" "0.25.2" + "@esbuild/win32-arm64" "0.25.2" + "@esbuild/win32-ia32" "0.25.2" + "@esbuild/win32-x64" "0.25.2" + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-import-resolver-node@^0.3.9: + 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== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.1.tgz" + integrity sha512-/dR9YMomeBlvfuvX5q0C3Y/2PHC9OCRdT2ijFwdfq/4Bq+4m5/lqstEp9k3P6ocha1pCbhoY9fkwVYLmOqR0VQ== + dependencies: + debug "^4.4.0" + get-tsconfig "^4.10.0" + is-bun-module "^2.0.0" + stable-hash "^0.0.5" + tinyglobby "^0.2.12" + unrs-resolver "^1.3.3" + +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@*, eslint-plugin-import@^2.31.0: + 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== + 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" + +eslint-plugin-perfectionist@^4.11.0: + version "4.11.0" + resolved "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.11.0.tgz" + integrity sha512-5s+ehXydnLPQpLDj5mJ0CnYj2fQe6v6gKA3tS+FZVBLzwMOh8skH+l+1Gni08rG0SdEcNhJyjQp/mEkDYK8czw== + dependencies: + "@typescript-eslint/types" "^8.29.0" + "@typescript-eslint/utils" "^8.29.0" + natural-orderby "^5.0.0" + +eslint-plugin-react-hooks@^5.2.0: + 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== + +eslint-plugin-react@^7.37.4: + version "7.37.4" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== + 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.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-plugin-unused-imports@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz" + integrity sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ== + +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + 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== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", "eslint@^9.0.0 || ^8.0.0", eslint@^9.23.0, eslint@>=7, eslint@>=8.45.0: + version "9.23.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz" + integrity sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.2" + "@eslint/config-helpers" "^0.2.0" + "@eslint/core" "^0.12.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.23.0" + "@eslint/plugin-kit" "^0.2.7" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + 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" + +fast-json-stable-stringify@^2.0.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.3: + version "6.4.3" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + 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: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-tsconfig@^4.10.0: + version "4.10.0" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.0.0: + version "16.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz" + integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hoist-non-react-statics@^3.3.1: + 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== + dependencies: + react-is "^16.7.0" + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + 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== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + 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== + 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" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + 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== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + 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== + +is-number-object@^1.1.1: + 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== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-regex@^1.2.1: + 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== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + 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== + +is-shared-array-buffer@^1.0.4: + 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== + dependencies: + call-bound "^1.0.3" + +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + 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" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + 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== + +json-schema-traverse@^0.4.1: + 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== + +json-stable-stringify-without-jsonify@^1.0.1: + 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== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimal-shared@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/minimal-shared/-/minimal-shared-1.0.7.tgz" + integrity sha512-KP+8dQw43lTkE1vCqjV4dakapCP5sk5trFAo8d2kpJYBZQc3DrGoE1Q9uwKe0hDtbgSwE4zmVYdgmsatF9/JZw== + dependencies: + es-toolkit "^1.32.0" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +natural-orderby@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz" + integrity sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg== + +npm-run-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz" + integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== + dependencies: + path-key "^4.0.0" + unicorn-magic "^0.3.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + 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: + version "1.1.9" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +optionator@^0.9.3, optionator@^0.9.4: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + 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" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + 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== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + 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== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + 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" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +"picomatch@^3 || ^4", picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-apexcharts@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz" + integrity sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA== + dependencies: + prop-types "^15.8.1" + +"react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^19.1.0, react-dom@>=16.6.0, react-dom@>=18: + version "19.1.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== + dependencies: + scheduler "^0.26.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^19.0.0: + version "19.1.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz" + integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg== + +react-router-dom@^7.4.1: + version "7.4.1" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.1.tgz" + integrity sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA== + dependencies: + react-router "7.4.1" + +react-router@7.4.1: + version "7.4.1" + resolved "https://registry.npmjs.org/react-router/-/react-router-7.4.1.tgz" + integrity sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg== + dependencies: + "@types/cookie" "^0.6.0" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + turbo-stream "2.4.0" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +"react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.1.0, react@>=0.13, react@>=16, react@>=16.6.0, react@>=16.8.0, react@>=18: + version "19.1.0" + resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + 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== + 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" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.3: + 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== + 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" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.19.0, resolve@^1.22.4: + version "1.22.10" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + 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: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rollup@^4.30.1: + version "4.39.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz" + integrity sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.39.0" + "@rollup/rollup-android-arm64" "4.39.0" + "@rollup/rollup-darwin-arm64" "4.39.0" + "@rollup/rollup-darwin-x64" "4.39.0" + "@rollup/rollup-freebsd-arm64" "4.39.0" + "@rollup/rollup-freebsd-x64" "4.39.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.39.0" + "@rollup/rollup-linux-arm-musleabihf" "4.39.0" + "@rollup/rollup-linux-arm64-gnu" "4.39.0" + "@rollup/rollup-linux-arm64-musl" "4.39.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.39.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.39.0" + "@rollup/rollup-linux-riscv64-gnu" "4.39.0" + "@rollup/rollup-linux-riscv64-musl" "4.39.0" + "@rollup/rollup-linux-s390x-gnu" "4.39.0" + "@rollup/rollup-linux-x64-gnu" "4.39.0" + "@rollup/rollup-linux-x64-musl" "4.39.0" + "@rollup/rollup-win32-arm64-msvc" "4.39.0" + "@rollup/rollup-win32-ia32-msvc" "4.39.0" + "@rollup/rollup-win32-x64-msvc" "4.39.0" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + 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" + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.6.0, semver@^7.7.1: + version "7.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + +set-function-length@^1.2.2: + 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== + 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" + +set-function-name@^2.0.2: + 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== + 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-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + 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== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + 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" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + 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" + +simplebar-core@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.3.0.tgz" + integrity sha512-LpWl3w0caz0bl322E68qsrRPpIn+rWBGAaEJ0lUJA7Xpr2sw92AkIhg6VWj988IefLXYh50ILatfAnbNoCFrlA== + dependencies: + lodash "^4.17.21" + +simplebar-react@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.3.0.tgz" + integrity sha512-sxzy+xRuU41He4tT4QLGYutchtOuye/xxVeq7xhyOiwMiHNK1ZpvbOTyy+7P0i7gfpXLGTJ8Bep8+4Mhdgtz/g== + dependencies: + simplebar-core "^1.3.0" + +source-map-js@^1.2.1: + 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== + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +stable-hash@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz" + integrity sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA== + +string.prototype.matchall@^4.0.12: + 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== + 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: + 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== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + 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== + 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" + +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + 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== + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +tiny-invariant@^1.3.3: + 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== + +tinyglobby@^0.2.12: + version "0.2.12" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz" + integrity sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +turbo-stream@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz" + integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + 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== + 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" + +typed-array-byte-offset@^1.0.4: + 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== + 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: + 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== + 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" + +typescript-eslint@^8.29.0: + version "8.29.0" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.0.tgz" + integrity sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg== + dependencies: + "@typescript-eslint/eslint-plugin" "8.29.0" + "@typescript-eslint/parser" "8.29.0" + "@typescript-eslint/utils" "8.29.0" + +typescript@*, typescript@^5.8.2, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0": + version "5.8.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz" + integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== + +unrs-resolver@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz" + integrity sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A== + optionalDependencies: + "@unrs/resolver-binding-darwin-arm64" "1.3.3" + "@unrs/resolver-binding-darwin-x64" "1.3.3" + "@unrs/resolver-binding-freebsd-x64" "1.3.3" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.3.3" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.3.3" + "@unrs/resolver-binding-linux-arm64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-arm64-musl" "1.3.3" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-s390x-gnu" "1.3.3" + "@unrs/resolver-binding-linux-x64-gnu" "1.3.3" + "@unrs/resolver-binding-linux-x64-musl" "1.3.3" + "@unrs/resolver-binding-wasm32-wasi" "1.3.3" + "@unrs/resolver-binding-win32-arm64-msvc" "1.3.3" + "@unrs/resolver-binding-win32-ia32-msvc" "1.3.3" + "@unrs/resolver-binding-win32-x64-msvc" "1.3.3" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vite-plugin-checker@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.9.1.tgz" + integrity sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ== + dependencies: + "@babel/code-frame" "^7.26.2" + chokidar "^4.0.3" + npm-run-path "^6.0.0" + picocolors "^1.1.1" + picomatch "^4.0.2" + strip-ansi "^7.1.0" + tiny-invariant "^1.3.3" + tinyglobby "^0.2.12" + vscode-uri "^3.1.0" + +"vite@^4 || ^5 || ^6", vite@^6.2.5, vite@>=2.0.0: + version "6.2.5" + resolved "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz" + integrity sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA== + dependencies: + esbuild "^0.25.0" + postcss "^8.5.3" + rollup "^4.30.1" + optionalDependencies: + fsevents "~2.3.3" + +vscode-uri@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + 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: + 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== + 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" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.19" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + 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" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.4.2: + version "2.7.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz" + integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==