diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..8b7acb3
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,5 @@
+.github
+.husky
+.vscode/
+dist/
+node_modules/
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..dccf841
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,19 @@
+root = true
+
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=true
+indent_style=space
+indent_size=2
+max_line_length = 100
+
+[*.{yml,yaml,json}]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..79ec814
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,23 @@
+*.sh
+node_modules
+*.lock
+**/*.svg
+**/*.md
+**/*.svg
+**/*.ejs
+**/*.html
+**/*.png
+**/*.toml
+**/*.md
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+Dockerfile
+pnpm-lock.yaml
+tsconfig.node.json
+/src/_mock
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..423fa08
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,140 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true, node: true },
+
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ project: './tsconfig.eslint.json',
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ ecmaFeatures: {
+ jsx: true,
+ },
+ extraFileExtensions: ['.json'],
+ },
+ settings: {
+ 'import/resolver': {
+ alias: {
+ map: [
+ ['@', './src'],
+ ['#', './types'],
+ ['msw/browser', './node_modules/msw/browser']
+ ],
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
+ },
+ },
+ },
+
+ extends: [
+ 'airbnb',
+ 'airbnb-typescript',
+ 'airbnb/hooks',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:jsx-a11y/recommended',
+ 'plugin:import/errors',
+ 'plugin:import/warnings',
+ 'prettier',
+ 'plugin:prettier/recommended',
+ ],
+
+ plugins: [
+ '@typescript-eslint',
+ 'prettier',
+ 'react',
+ 'react-hooks',
+ 'jsx-a11y',
+ 'import',
+ 'unused-imports',
+ ],
+
+ rules: {
+ semi: ['error', 'always'],
+ 'no-console': 'off',
+ 'no-unused-vars': 'off',
+ 'no-case-declarations': 'off',
+ 'no-use-before-define': 'off',
+ 'no-param-reassign': 'off',
+ 'space-before-function-paren': 'off',
+ 'class-methods-use-this': 'off',
+
+ 'jsx-a11y/click-events-have-key-events': 'off',
+ 'jsx-a11y/interactive-supports-focus': 'off',
+ 'jsx-a11y/no-noninteractive-element-interactions': 'off',
+ 'jsx-a11y/no-static-element-interactions': 'off',
+
+ 'react/react-in-jsx-scope': 'off',
+ 'react/button-has-type': 'off',
+ 'react/require-default-props': 'off',
+ 'react/no-array-index-key': 'off',
+ 'react/jsx-props-no-spreading': 'off',
+
+ 'import/first': 'warn',
+ 'import/newline-after-import': 'warn',
+ 'import/no-duplicates': 'warn',
+ 'import/no-extraneous-dependencies': 'off',
+ 'import/prefer-default-export': 'off',
+ 'import/no-cycle': 'off',
+ 'import/order': [
+ 'warn',
+ {
+ groups: [
+ 'builtin',
+ 'external',
+ 'internal',
+ 'parent',
+ ['sibling', 'index'],
+ 'object',
+ 'type',
+ ],
+ pathGroups: [
+ {
+ pattern: '@/**',
+ group: 'internal',
+ },
+ {
+ pattern: '#/**',
+ group: 'type',
+ },
+ {
+ pattern: '*.{scss,css,less,styl,stylus}',
+ group: 'parent',
+ },
+ {
+ pattern: '*.{js,jsx,ts,tsx}',
+ group: 'sibling',
+ },
+ ],
+ 'newlines-between': 'always',
+ pathGroupsExcludedImportTypes: ['sibling', 'index'],
+ warnOnUnassignedImports: true,
+ alphabetize: { order: 'asc', caseInsensitive: true },
+ },
+ ],
+
+ 'unused-imports/no-unused-imports-ts': 'warn',
+ 'unused-imports/no-unused-vars-ts': [
+ 'warn',
+ { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' },
+ ],
+
+ '@typescript-eslint/no-unused-vars': [
+ 'warn',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ },
+ ],
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/ban-ts-ignore': 'off',
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/no-shadow': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ },
+};
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..ea59817
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,33 @@
+---
+name: 👾 Bug Report
+about: Report a bug or issue with the project.
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+### Description
+A clear and concise description of what the bug is.
+
+### Steps To Reproduce
+1. Log in...
+2. Ensure that...
+3. Allow a long period of inactivity to pass...
+4. Observe that...
+5. Attempt to log in...
+
+### Current Behavior
+- After the period of inactivity...
+- When the user tries to log in using another method...
+- This causes a bug due to...
+
+### Expected Behavior
+- After a long period of inactivity...
+- When a user logs in successfully...
+- This ensures that only...
+
+### Environment
+- Platform: PC
+- Node: v18.18.0
+- Browser: Chrome 126.0.6478.56
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..163c1c4
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,10 @@
+blank_issues_enabled: false
+issue_template:
+ - name: 👾 Bug Report
+ description: Report a bug or issue with the project.
+ labels: ["bug"]
+ template: bug_report.md
+ - name: 💡 Feature Request
+ description: Create a new ticket for a new feature request.
+ labels: ["enhancement"]
+ template: feature_request.md
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..a4b8175
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,27 @@
+---
+name: 💡 Feature Request
+about: Create a new ticket for a new feature request
+title: ''
+labels: 'enhancement'
+assignees: ''
+
+---
+
+### Expected Behavior
+Describe the expected behavior here.
+
+### Specifications
+As a `user`, I would like to `action` so that `reason`.
+
+**Features:**
+- describe feature details here.
+
+**Development Tasks:**
+- [ ] Task 1
+- [ ] Task 2
+
+### Dependencies
+List any dependencies that are required for this feature by providing links to the issues or repositories.
+
+### References
+List any references that are related to this feature request.
\ No newline at end of file
diff --git a/.github/workflows/deploy-tag.yaml b/.github/workflows/deploy-tag.yaml
new file mode 100644
index 0000000..a94307d
--- /dev/null
+++ b/.github/workflows/deploy-tag.yaml
@@ -0,0 +1,54 @@
+name: Build and Deploy Production
+
+on:
+ push:
+ tags:
+ - 'v*.*.*'
+
+jobs:
+ build-and-push-image:
+ runs-on: aelfscan-runner
+ permissions:
+ contents: read
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Create image tag
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ secrets.REPOSITORY_REGION }}-docker.pkg.dev/${{ secrets.PROJECT_ID }}/${{ secrets.REPOSITORY }}/aelfscan-advertising-web
+ tags: |
+ type=ref,event=tag
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ platforms: linux/amd64
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+ dispatch:
+ runs-on: aelfscan-runner
+ needs: build-and-push-image
+ steps:
+ - name: Deploy
+ uses: actions/github-script@v6
+ with:
+ github-token: ${{ secrets.TOK }}
+ script: |
+ await github.rest.actions.createWorkflowDispatch({
+ owner: 'AelfScanProject',
+ repo: 'devops',
+ workflow_id: 'aelf-explorer-server-deploy.yaml',
+ ref: 'main',
+ inputs: {
+ env: 'production',
+ appName: 'aelfscan-advertising-web',
+ commit_sha: '${{ github.ref_name }}',
+ }
+ })
diff --git a/.github/workflows/deploy-testnet.yaml b/.github/workflows/deploy-testnet.yaml
new file mode 100644
index 0000000..54e2403
--- /dev/null
+++ b/.github/workflows/deploy-testnet.yaml
@@ -0,0 +1,61 @@
+name: Build and Deploy Testnet
+
+on:
+ push:
+ branches:
+ - 'release/*'
+
+jobs:
+ build-and-push-image:
+ runs-on: aelfscan-runner
+ permissions:
+ contents: read
+ outputs:
+ short_sha: ${{ steps.vars.outputs.short_sha }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Set short git commit SHA
+ id: vars
+ run: |
+ calculatedSha=$(git rev-parse --short ${{ github.sha }})
+ echo "short_sha=$calculatedSha" >> "$GITHUB_OUTPUT"
+ - name: Create image tag
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: ${{ secrets.REPOSITORY_REGION }}-docker.pkg.dev/${{ secrets.PROJECT_ID }}/${{ secrets.REPOSITORY }}/aelfscan-advertising-web
+ tags: |
+ type=sha
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ platforms: linux/amd64
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+ dispatch:
+ runs-on: aelfscan-runner
+ needs: build-and-push-image
+ steps:
+ - name: Deploy
+ uses: actions/github-script@v6
+ with:
+ github-token: ${{ secrets.TOK }}
+ script: |
+ await github.rest.actions.createWorkflowDispatch({
+ owner: 'AelfScanProject',
+ repo: 'devops',
+ workflow_id: 'aelf-explorer-server-deploy.yaml',
+ ref: 'main',
+ inputs: {
+ env: 'testnet',
+ appName: 'aelfscan-advertising-web',
+ commit_sha: 'sha-${{ needs.build-and-push-image.outputs.short_sha }}',
+ }
+ })
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
new file mode 100644
index 0000000..62cc37d
--- /dev/null
+++ b/.github/workflows/security.yml
@@ -0,0 +1,23 @@
+name: Security Review
+
+permissions:
+ pull-requests: write
+ contents: read
+
+on:
+ pull_request:
+
+jobs:
+ security:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
+ fetch-depth: 2
+
+ - uses: Portkey-Wallet/claude-code-security-review@main
+ with:
+ comment-pr: true
+ claude-api-key: ${{ secrets.CLAUDE_API_KEY }}
+ run-every-commit: true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8ab620c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+stats.html
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100755
index 0000000..80416c7
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit "$1"
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 0000000..d24fdfc
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/.lintstagedrc b/.lintstagedrc
new file mode 100644
index 0000000..784055b
--- /dev/null
+++ b/.lintstagedrc
@@ -0,0 +1,5 @@
+{
+ "src/**/*.{js,jsx,ts,tsx}": ["eslint --fix"],
+ "src/**/*.{css,scss}": ["stylelint --fix"],
+ "*.{json,md}": ["prettier --write"]
+}
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..b172d95
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,21 @@
+*.sh
+node_modules
+*.lock
+**/*.svg
+**/*.md
+**/*.svg
+**/*.ejs
+**/*.html
+**/*.png
+**/*.toml
+**/*.md
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+Dockerfile
+pnpm-lock.yaml
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..6df60f9
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,21 @@
+{
+ "printWidth": 100,
+ "semi": true,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "trailingComma": "all",
+ "proseWrap": "never",
+ "htmlWhitespaceSensitivity": "strict",
+ "endOfLine": "auto",
+ "overrides": [
+ {
+ "files": "*rc",
+ "options": {
+ "parser": "json"
+ }
+ }
+ ],
+ "plugins": [
+ "prettier-plugin-tailwindcss"
+ ]
+}
diff --git a/.stylelintignore b/.stylelintignore
new file mode 100644
index 0000000..b715f87
--- /dev/null
+++ b/.stylelintignore
@@ -0,0 +1,8 @@
+node_modules/
+dist/
+build/
+*.min.css
+*.js
+*.tsx
+*.ts
+*.json
diff --git a/.stylelintrc b/.stylelintrc
new file mode 100644
index 0000000..a751afb
--- /dev/null
+++ b/.stylelintrc
@@ -0,0 +1,71 @@
+{
+ "extends": [
+ "stylelint-config-standard",
+ "stylelint-config-rational-order"
+ ],
+ "plugins": ["stylelint-order"],
+ "rules": {
+ "indentation": 2,
+ "declaration-colon-space-after": "always",
+ "declaration-colon-space-before": "never",
+ "declaration-block-semicolon-newline-after": "always-multi-line",
+ "selector-not-notation": null,
+ "import-notation": null,
+ "function-no-unknown": null,
+ "selector-class-pattern": null,
+ "selector-pseudo-class-no-unknown": [
+ true,
+ {
+ "ignorePseudoClasses": ["global", "local"]
+ }
+ ],
+ "at-rule-no-unknown": [
+ true,
+ {
+ "ignoreAtRules": [
+ "tailwind",
+ "apply",
+ "variants",
+ "responsive",
+ "screen",
+ "function",
+ "if",
+ "each",
+ "include",
+ "mixin",
+ "extend"
+ ]
+ }
+ ],
+ "no-empty-source": null,
+ "string-quotes": null,
+ "named-grid-areas-no-invalid": null,
+ "no-descending-specificity": null,
+ "font-family-no-missing-generic-family-keyword": null,
+ "rule-empty-line-before": [
+ "always",
+ {
+ "ignore": ["after-comment", "first-nested"]
+ }
+ ],
+ "unit-no-unknown": [true, { "ignoreUnits": ["rpx"] }],
+ "order/order": [
+ [
+ "dollar-variables",
+ "custom-properties",
+ "at-rules",
+ "declarations",
+ {
+ "type": "at-rule",
+ "name": "supports"
+ },
+ {
+ "type": "at-rule",
+ "name": "media"
+ },
+ "rules"
+ ],
+ { "severity": "error" }
+ ]
+ }
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..b388f50
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,8 @@
+{
+ "recommendations": [
+ "dbaeumer.vscode-eslint",
+ "stylelint.vscode-stylelint",
+ "esbenp.prettier-vscode",
+ "lokalise.i18n-ally",
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..b18b0f3
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,27 @@
+{
+ "typescript.tsdk": "./node_modules/typescript/lib",
+ "editor.tabSize": 2,
+ "editor.formatOnSave": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "explicit",
+ "source.fixAll.stylelint": "explicit"
+ },
+ "stylelint.validate": [
+ "css",
+ "scss",
+ "less",
+ "postcss"
+ ],
+ "npm.packageManager": "pnpm",
+ "i18n-ally.localesPaths": [
+ "src/locales/lang"
+ ],
+ "i18n-ally.enabledParsers": [
+ "json"
+ ],
+ "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
+ "i18n-ally.keystyle": "flat",
+ "i18n-ally.sortKeys": true,
+ "i18n-ally.sourceLanguage": "en_US",
+ "i18n-ally.displayLanguage": "zh_CN",
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..d2ed0f2
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+# Stage 1: build stage
+FROM node:22-alpine as build-stage
+# make the 'app' folder the current working directory
+WORKDIR /app
+# config node options
+ENV NODE_OPTIONS=--max_old_space_size=8192
+# config pnpm, install dependencies
+COPY package.json pnpm-lock.yaml* ./
+RUN npm install pnpm@9.x -g && \
+ pnpm install --frozen-lockfile
+# copy project files and folders to the current working directory (i.e. 'app' folder)
+COPY . ./
+# build the project
+RUN pnpm build
+RUN echo "build successful 🎉 🎉 🎉"
+
+
+# Stage 2: production stage
+FROM nginx:latest as production-stage
+COPY --from=build-stage /app/dist /usr/share/nginx/html
+COPY default.conf /etc/nginx/conf.d/default.conf
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]
+RUN echo "deploy to nginx successful 🎉 🎉 🎉"
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ceb73cc
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 d3george
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000..7080d63
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,29 @@
+export default {
+ extends: ['@commitlint/config-conventional'],
+
+ rules: {
+ 'body-leading-blank': [2, 'always'],
+ 'type-empty': [2, 'never'],
+ 'subject-case': [0],
+
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'feat',
+ 'fix',
+ 'docs',
+ 'style',
+ 'refactor',
+ 'perf',
+ 'test',
+ 'chore',
+ 'revert',
+ 'build',
+ 'ci',
+ 'types',
+ 'wip',
+ ],
+ ],
+ },
+};
diff --git a/default.conf b/default.conf
new file mode 100644
index 0000000..1b66dd3
--- /dev/null
+++ b/default.conf
@@ -0,0 +1,45 @@
+server {
+ listen 80;
+ listen [::]:80;
+ server_name localhost;
+
+ #access_log /var/log/nginx/host.access.log main;
+
+ location / {
+ root /usr/share/nginx/html;
+ #index index.html index.htm;
+ try_files $uri /index.html;
+ }
+
+ #error_page 404 /404.html;
+
+ # redirect server error pages to the static page /50x.html
+ #
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+
+ # proxy the PHP scripts to Apache listening on 127.0.0.1:80
+ #
+ #location ~ \.php$ {
+ # proxy_pass http://127.0.0.1;
+ #}
+
+ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+ #
+ #location ~ \.php$ {
+ # root html;
+ # fastcgi_pass 127.0.0.1:9000;
+ # fastcgi_index index.php;
+ # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
+ # include fastcgi_params;
+ #}
+
+ # deny access to .htaccess files, if Apache's document root
+ # concurs with nginx's one
+ #
+ #location ~ /\.ht {
+ # deny all;
+ #}
+}
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..c34a48a
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,7 @@
+services:
+ slash:
+ build:
+ context: .
+ ports:
+ - "3001:80"
+ restart: always
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..275b075
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+ aelfscan AD management background
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..c9e492a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,125 @@
+{
+ "name": "slash-admin",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "homepage": "https://d3george.github.io/react-admin-template",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview",
+ "prepare": "husky install"
+ },
+ "dependencies": {
+ "@ant-design/cssinjs": "^1.17.2",
+ "@ant-design/icons": "^5.2.6",
+ "@aws-sdk/client-cognito-identity": "^3.631.0",
+ "@aws-sdk/client-s3": "^3.631.0",
+ "@aws-sdk/credential-provider-cognito-identity": "^3.631.0",
+ "@fullcalendar/common": "^5.11.5",
+ "@fullcalendar/core": "^6.1.9",
+ "@fullcalendar/daygrid": "^6.1.9",
+ "@fullcalendar/interaction": "^6.1.9",
+ "@fullcalendar/list": "^6.1.9",
+ "@fullcalendar/react": "^6.1.9",
+ "@fullcalendar/timegrid": "^6.1.9",
+ "@fullcalendar/timeline": "^6.1.9",
+ "@iconify/react": "^4.1.1",
+ "@tanstack/react-query": "^5.50.1",
+ "@tanstack/react-query-devtools": "^5.50.1",
+ "@types/qs": "^6.9.15",
+ "@vercel/analytics": "^1.2.2",
+ "@vitejs/plugin-react": "^4.1.0",
+ "antd": "^5.20.1",
+ "apexcharts": "^3.43.0",
+ "autosuggest-highlight": "^3.3.4",
+ "axios": "^1.5.1",
+ "classnames": "^2.3.2",
+ "color": "^4.2.3",
+ "dayjs": "^1.11.10",
+ "framer-motion": "^10.16.4",
+ "highlight.js": "^11.9.0",
+ "i18next": "^23.5.1",
+ "i18next-browser-languagedetector": "^7.1.0",
+ "nprogress": "^0.2.0",
+ "numeral": "^2.0.6",
+ "qs": "^6.13.0",
+ "ramda": "^0.29.1",
+ "react": "18.2.0",
+ "react-apexcharts": "^1.4.1",
+ "react-beautiful-dnd": "^13.1.1",
+ "react-dom": "18.2.0",
+ "react-error-boundary": "^4.0.13",
+ "react-helmet-async": "^1.3.0",
+ "react-i18next": "^13.2.2",
+ "react-icons": "^4.11.0",
+ "react-markdown": "^8.0.7",
+ "react-organizational-chart": "^2.2.1",
+ "react-quill": "^2.0.0",
+ "react-router-dom": "^6.16.0",
+ "react-use": "^17.4.0",
+ "rehype-highlight": "^6.0.0",
+ "rehype-raw": "^6.1.1",
+ "remark-gfm": "^3.0.1",
+ "reset-css": "^5.0.2",
+ "screenfull": "^6.0.2",
+ "simplebar-react": "^3.2.4",
+ "styled-components": "^6.0.9",
+ "vite": "^4.4.11",
+ "zustand": "^4.4.3"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^17.7.2",
+ "@commitlint/config-conventional": "^17.7.0",
+ "@faker-js/faker": "^8.1.0",
+ "@types/autosuggest-highlight": "^3.2.0",
+ "@types/color": "^3.0.4",
+ "@types/nprogress": "^0.2.1",
+ "@types/numeral": "^2.0.3",
+ "@types/ramda": "^0.29.6",
+ "@types/react": "^18.2.28",
+ "@types/react-beautiful-dnd": "^13.1.6",
+ "@types/react-dom": "^18.2.13",
+ "@types/react-router-dom": "^5.3.3",
+ "@types/styled-components": "^5.1.28",
+ "@typescript-eslint/eslint-plugin": "^5.62.0",
+ "@typescript-eslint/parser": "^5.62.0",
+ "autoprefixer": "^10.4.16",
+ "eslint": "^8.51.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-airbnb-typescript": "^17.1.0",
+ "eslint-config-prettier": "^8.10.0",
+ "eslint-import-resolver-alias": "^1.1.2",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-unused-imports": "^2.0.0",
+ "husky": "^8.0.3",
+ "lint-staged": "^13.3.0",
+ "msw": "^2.2.14",
+ "postcss": "^8.4.31",
+ "postcss-import": "^15.1.0",
+ "postcss-nesting": "^11.3.0",
+ "prettier": "^2.8.8",
+ "prettier-plugin-tailwindcss": "^0.3.0",
+ "rollup-plugin-visualizer": "^5.9.2",
+ "sass": "^1.69.3",
+ "stylelint": "^15.10.3",
+ "stylelint-config-rational-order": "^0.1.2",
+ "stylelint-config-standard": "^33.0.0",
+ "stylelint-declaration-block-no-ignored-properties": "^2.7.0",
+ "stylelint-order": "^6.0.3",
+ "tailwindcss": "^3.3.3",
+ "terser": "^5.26.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.2.2",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-tsconfig-paths": "^4.2.1"
+ },
+ "msw": {
+ "workerDirectory": "public"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..fc85cfa
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,12973 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@ant-design/cssinjs':
+ specifier: ^1.17.2
+ version: 1.17.2(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/icons':
+ specifier: ^5.2.6
+ version: 5.2.6(react-dom@18.2.0)(react@18.2.0)
+ '@aws-sdk/client-cognito-identity':
+ specifier: ^3.631.0
+ version: 3.631.0
+ '@aws-sdk/client-s3':
+ specifier: ^3.631.0
+ version: 3.631.0
+ '@aws-sdk/credential-provider-cognito-identity':
+ specifier: ^3.631.0
+ version: 3.631.0
+ '@fullcalendar/common':
+ specifier: ^5.11.5
+ version: 5.11.5
+ '@fullcalendar/core':
+ specifier: ^6.1.9
+ version: 6.1.9
+ '@fullcalendar/daygrid':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)
+ '@fullcalendar/interaction':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)
+ '@fullcalendar/list':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)
+ '@fullcalendar/react':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)(react-dom@18.2.0)(react@18.2.0)
+ '@fullcalendar/timegrid':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)
+ '@fullcalendar/timeline':
+ specifier: ^6.1.9
+ version: 6.1.9(@fullcalendar/core@6.1.9)
+ '@iconify/react':
+ specifier: ^4.1.1
+ version: 4.1.1(react@18.2.0)
+ '@tanstack/react-query':
+ specifier: ^5.50.1
+ version: 5.50.1(react@18.2.0)
+ '@tanstack/react-query-devtools':
+ specifier: ^5.50.1
+ version: 5.50.1(@tanstack/react-query@5.50.1)(react@18.2.0)
+ '@types/qs':
+ specifier: ^6.9.15
+ version: 6.9.15
+ '@vercel/analytics':
+ specifier: ^1.2.2
+ version: 1.2.2(react@18.2.0)
+ '@vitejs/plugin-react':
+ specifier: ^4.1.0
+ version: 4.1.0(vite@4.4.11)
+ antd:
+ specifier: ^5.20.1
+ version: 5.20.1(react-dom@18.2.0)(react@18.2.0)
+ apexcharts:
+ specifier: ^3.43.0
+ version: 3.43.0
+ autosuggest-highlight:
+ specifier: ^3.3.4
+ version: 3.3.4
+ axios:
+ specifier: ^1.5.1
+ version: 1.5.1
+ classnames:
+ specifier: ^2.3.2
+ version: 2.3.2
+ color:
+ specifier: ^4.2.3
+ version: 4.2.3
+ dayjs:
+ specifier: ^1.11.10
+ version: 1.11.10
+ framer-motion:
+ specifier: ^10.16.4
+ version: 10.16.4(react-dom@18.2.0)(react@18.2.0)
+ highlight.js:
+ specifier: ^11.9.0
+ version: 11.9.0
+ i18next:
+ specifier: ^23.5.1
+ version: 23.5.1
+ i18next-browser-languagedetector:
+ specifier: ^7.1.0
+ version: 7.1.0
+ nprogress:
+ specifier: ^0.2.0
+ version: 0.2.0
+ numeral:
+ specifier: ^2.0.6
+ version: 2.0.6
+ qs:
+ specifier: ^6.13.0
+ version: 6.13.0
+ ramda:
+ specifier: ^0.29.1
+ version: 0.29.1
+ react:
+ specifier: 18.2.0
+ version: 18.2.0
+ react-apexcharts:
+ specifier: ^1.4.1
+ version: 1.4.1(apexcharts@3.43.0)(react@18.2.0)
+ react-beautiful-dnd:
+ specifier: ^13.1.1
+ version: 13.1.1(react-dom@18.2.0)(react@18.2.0)
+ react-dom:
+ specifier: 18.2.0
+ version: 18.2.0(react@18.2.0)
+ react-error-boundary:
+ specifier: ^4.0.13
+ version: 4.0.13(react@18.2.0)
+ react-helmet-async:
+ specifier: ^1.3.0
+ version: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+ react-i18next:
+ specifier: ^13.2.2
+ version: 13.2.2(i18next@23.5.1)(react-dom@18.2.0)(react@18.2.0)
+ react-icons:
+ specifier: ^4.11.0
+ version: 4.11.0(react@18.2.0)
+ react-markdown:
+ specifier: ^8.0.7
+ version: 8.0.7(@types/react@18.2.28)(react@18.2.0)
+ react-organizational-chart:
+ specifier: ^2.2.1
+ version: 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ react-quill:
+ specifier: ^2.0.0
+ version: 2.0.0(react-dom@18.2.0)(react@18.2.0)
+ react-router-dom:
+ specifier: ^6.16.0
+ version: 6.16.0(react-dom@18.2.0)(react@18.2.0)
+ react-use:
+ specifier: ^17.4.0
+ version: 17.4.0(react-dom@18.2.0)(react@18.2.0)
+ rehype-highlight:
+ specifier: ^6.0.0
+ version: 6.0.0
+ rehype-raw:
+ specifier: ^6.1.1
+ version: 6.1.1
+ remark-gfm:
+ specifier: ^3.0.1
+ version: 3.0.1
+ reset-css:
+ specifier: ^5.0.2
+ version: 5.0.2
+ screenfull:
+ specifier: ^6.0.2
+ version: 6.0.2
+ simplebar-react:
+ specifier: ^3.2.4
+ version: 3.2.4(react@18.2.0)
+ styled-components:
+ specifier: ^6.0.9
+ version: 6.0.9(react-dom@18.2.0)(react@18.2.0)
+ vite:
+ specifier: ^4.4.11
+ version: 4.4.11(@types/node@22.4.1)(sass@1.69.3)(terser@5.26.0)
+ zustand:
+ specifier: ^4.4.3
+ version: 4.4.3(@types/react@18.2.28)(react@18.2.0)
+
+devDependencies:
+ '@commitlint/cli':
+ specifier: ^17.7.2
+ version: 17.7.2
+ '@commitlint/config-conventional':
+ specifier: ^17.7.0
+ version: 17.7.0
+ '@faker-js/faker':
+ specifier: ^8.1.0
+ version: 8.1.0
+ '@types/autosuggest-highlight':
+ specifier: ^3.2.0
+ version: 3.2.0
+ '@types/color':
+ specifier: ^3.0.4
+ version: 3.0.4
+ '@types/nprogress':
+ specifier: ^0.2.1
+ version: 0.2.1
+ '@types/numeral':
+ specifier: ^2.0.3
+ version: 2.0.3
+ '@types/ramda':
+ specifier: ^0.29.6
+ version: 0.29.6
+ '@types/react':
+ specifier: ^18.2.28
+ version: 18.2.28
+ '@types/react-beautiful-dnd':
+ specifier: ^13.1.6
+ version: 13.1.6
+ '@types/react-dom':
+ specifier: ^18.2.13
+ version: 18.2.13
+ '@types/react-router-dom':
+ specifier: ^5.3.3
+ version: 5.3.3
+ '@types/styled-components':
+ specifier: ^5.1.28
+ version: 5.1.28
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^5.62.0
+ version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2)
+ '@typescript-eslint/parser':
+ specifier: ^5.62.0
+ version: 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ autoprefixer:
+ specifier: ^10.4.16
+ version: 10.4.16(postcss@8.4.31)
+ eslint:
+ specifier: ^8.51.0
+ version: 8.51.0
+ eslint-config-airbnb:
+ specifier: ^19.0.4
+ version: 19.0.4(eslint-plugin-import@2.28.1)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.51.0)
+ eslint-config-airbnb-typescript:
+ specifier: ^17.1.0
+ version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.51.0)
+ eslint-config-prettier:
+ specifier: ^8.10.0
+ version: 8.10.0(eslint@8.51.0)
+ eslint-import-resolver-alias:
+ specifier: ^1.1.2
+ version: 1.1.2(eslint-plugin-import@2.28.1)
+ eslint-plugin-import:
+ specifier: ^2.28.1
+ version: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)
+ eslint-plugin-jsx-a11y:
+ specifier: ^6.7.1
+ version: 6.7.1(eslint@8.51.0)
+ eslint-plugin-prettier:
+ specifier: ^4.2.1
+ version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.51.0)(prettier@2.8.8)
+ eslint-plugin-react:
+ specifier: ^7.33.2
+ version: 7.33.2(eslint@8.51.0)
+ eslint-plugin-react-hooks:
+ specifier: ^4.6.0
+ version: 4.6.0(eslint@8.51.0)
+ eslint-plugin-unused-imports:
+ specifier: ^2.0.0
+ version: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.51.0)
+ husky:
+ specifier: ^8.0.3
+ version: 8.0.3
+ lint-staged:
+ specifier: ^13.3.0
+ version: 13.3.0
+ msw:
+ specifier: ^2.2.14
+ version: 2.2.14(typescript@5.2.2)
+ postcss:
+ specifier: ^8.4.31
+ version: 8.4.31
+ postcss-import:
+ specifier: ^15.1.0
+ version: 15.1.0(postcss@8.4.31)
+ postcss-nesting:
+ specifier: ^11.3.0
+ version: 11.3.0(postcss@8.4.31)
+ prettier:
+ specifier: ^2.8.8
+ version: 2.8.8
+ prettier-plugin-tailwindcss:
+ specifier: ^0.3.0
+ version: 0.3.0(prettier@2.8.8)
+ rollup-plugin-visualizer:
+ specifier: ^5.9.2
+ version: 5.9.2
+ sass:
+ specifier: ^1.69.3
+ version: 1.69.3
+ stylelint:
+ specifier: ^15.10.3
+ version: 15.10.3(typescript@5.2.2)
+ stylelint-config-rational-order:
+ specifier: ^0.1.2
+ version: 0.1.2
+ stylelint-config-standard:
+ specifier: ^33.0.0
+ version: 33.0.0(stylelint@15.10.3)
+ stylelint-declaration-block-no-ignored-properties:
+ specifier: ^2.7.0
+ version: 2.7.0(stylelint@15.10.3)
+ stylelint-order:
+ specifier: ^6.0.3
+ version: 6.0.3(stylelint@15.10.3)
+ tailwindcss:
+ specifier: ^3.3.3
+ version: 3.3.3(ts-node@10.9.1)
+ terser:
+ specifier: ^5.26.0
+ version: 5.26.0
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.1(@types/node@22.4.1)(typescript@5.2.2)
+ typescript:
+ specifier: ^5.2.2
+ version: 5.2.2
+ vite-plugin-svg-icons:
+ specifier: ^2.0.1
+ version: 2.0.1(vite@4.4.11)
+ vite-tsconfig-paths:
+ specifier: ^4.2.1
+ version: 4.2.1(typescript@5.2.2)(vite@4.4.11)
+
+packages:
+
+ /@alloc/quick-lru@5.2.0:
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@ant-design/colors@7.1.0:
+ resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==}
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ dev: false
+
+ /@ant-design/cssinjs-utils@1.0.3(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BrztZZKuoYcJK8uEH40ylBemf/Mu/QPiDos56g2bv6eUoniQkgQHOCOvA3+pncoFO1TaS8xcUCIqGzDA0I+ZVQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0)(react@18.2.0)
+ '@babel/runtime': 7.25.0
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@ant-design/cssinjs@1.17.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-vu7lnfEx4Mf8MPzZxn506Zen3Nt4fRr2uutwvdCuTCN5IiU0lDdQ0tiJ24/rmB8+pefwjluYsbyzbQSbgfJy+A==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.3.2
+ csstype: 3.1.3
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ stylis: 4.3.2
+ dev: false
+
+ /@ant-design/cssinjs@1.21.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.3.2
+ csstype: 3.1.3
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ stylis: 4.3.2
+ dev: false
+
+ /@ant-design/fast-color@2.0.6:
+ resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==}
+ engines: {node: '>=8.x'}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /@ant-design/icons-svg@4.4.2:
+ resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+ dev: false
+
+ /@ant-design/icons@5.2.6(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@ant-design/colors': 7.1.0
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@ant-design/icons@5.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@ant-design/colors': 7.1.0
+ '@ant-design/icons-svg': 4.4.2
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@ant-design/react-slick@1.1.2(react@18.2.0):
+ resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ json2mq: 0.2.0
+ react: 18.2.0
+ resize-observer-polyfill: 1.5.1
+ throttle-debounce: 5.0.2
+ dev: false
+
+ /@aws-crypto/crc32@5.2.0:
+ resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/crc32c@5.2.0:
+ resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==}
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/sha1-browser@5.2.0:
+ resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==}
+ dependencies:
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-locate-window': 3.568.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/sha256-browser@5.2.0:
+ resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==}
+ dependencies:
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-locate-window': 3.568.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/sha256-js@5.2.0:
+ resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/supports-web-crypto@5.2.0:
+ resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-crypto/util@5.2.0:
+ resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/client-cognito-identity@3.631.0:
+ resolution: {integrity: sha512-TXRkgwiLmNpwbiQShtUtSSE4DDHblhjHvtgxtzonzvdlDvYmCmaOwAQgi3HWuHztJtZ9ghf3jKB3N3jxAuKBbA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sso-oidc': 3.631.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/client-sts': 3.631.0
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/credential-provider-node': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/middleware-host-header': 3.620.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.620.0
+ '@aws-sdk/middleware-user-agent': 3.631.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/core': 2.4.0
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/hash-node': 3.0.3
+ '@smithy/invalid-dependency': 3.0.3
+ '@smithy/middleware-content-length': 3.0.5
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.15
+ '@smithy/util-defaults-mode-node': 3.0.15
+ '@smithy/util-endpoints': 2.0.5
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-s3@3.631.0:
+ resolution: {integrity: sha512-VBZoG6oMMsL5zOvO8Wxxcpv4T/qmQiTv58C+7c4zaHsIM2lCzQsU042XwH/jenqPsse1FTM45HnanRDOLv99+w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha1-browser': 5.2.0
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sso-oidc': 3.631.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/client-sts': 3.631.0
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/credential-provider-node': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/middleware-bucket-endpoint': 3.620.0
+ '@aws-sdk/middleware-expect-continue': 3.620.0
+ '@aws-sdk/middleware-flexible-checksums': 3.620.0
+ '@aws-sdk/middleware-host-header': 3.620.0
+ '@aws-sdk/middleware-location-constraint': 3.609.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.620.0
+ '@aws-sdk/middleware-sdk-s3': 3.629.0
+ '@aws-sdk/middleware-ssec': 3.609.0
+ '@aws-sdk/middleware-user-agent': 3.631.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/signature-v4-multi-region': 3.629.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@aws-sdk/xml-builder': 3.609.0
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/core': 2.4.0
+ '@smithy/eventstream-serde-browser': 3.0.6
+ '@smithy/eventstream-serde-config-resolver': 3.0.3
+ '@smithy/eventstream-serde-node': 3.0.5
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/hash-blob-browser': 3.1.2
+ '@smithy/hash-node': 3.0.3
+ '@smithy/hash-stream-node': 3.1.2
+ '@smithy/invalid-dependency': 3.0.3
+ '@smithy/md5-js': 3.0.3
+ '@smithy/middleware-content-length': 3.0.5
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.15
+ '@smithy/util-defaults-mode-node': 3.0.15
+ '@smithy/util-endpoints': 2.0.5
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ '@smithy/util-stream': 3.1.3
+ '@smithy/util-utf8': 3.0.0
+ '@smithy/util-waiter': 3.1.2
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sso-oidc@3.631.0(@aws-sdk/client-sts@3.631.0):
+ resolution: {integrity: sha512-afJAssIvsHibVq65qO3Q31NCfSTsPEnyr+PT80uGVAkKev1PJI1AjsxBGUTLtPMV8lrzDzDx5CG9ax1AZ3LG6w==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.631.0
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sts': 3.631.0
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/credential-provider-node': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/middleware-host-header': 3.620.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.620.0
+ '@aws-sdk/middleware-user-agent': 3.631.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/core': 2.4.0
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/hash-node': 3.0.3
+ '@smithy/invalid-dependency': 3.0.3
+ '@smithy/middleware-content-length': 3.0.5
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.15
+ '@smithy/util-defaults-mode-node': 3.0.15
+ '@smithy/util-endpoints': 2.0.5
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sso@3.631.0:
+ resolution: {integrity: sha512-tpXRQMbbTsKED6GGF0rZbg9Nr0DRCWImopX2lVh4deIeHQfNxeOtq2brqDWiPD593I190xeL/HMChSOmvDXNAw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/middleware-host-header': 3.620.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.620.0
+ '@aws-sdk/middleware-user-agent': 3.631.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/core': 2.4.0
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/hash-node': 3.0.3
+ '@smithy/invalid-dependency': 3.0.3
+ '@smithy/middleware-content-length': 3.0.5
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.15
+ '@smithy/util-defaults-mode-node': 3.0.15
+ '@smithy/util-endpoints': 2.0.5
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sts@3.631.0:
+ resolution: {integrity: sha512-Zo/2XDrmNpnSRlQLL8XOCJxuN7UIrGKf4itdjHqtEmD2PqstnYe6IMeEVOELpZ8iktjvsIrVr+qxlIX1QlmgCQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sso-oidc': 3.631.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/credential-provider-node': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/middleware-host-header': 3.620.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.620.0
+ '@aws-sdk/middleware-user-agent': 3.631.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/core': 2.4.0
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/hash-node': 3.0.3
+ '@smithy/invalid-dependency': 3.0.3
+ '@smithy/middleware-content-length': 3.0.5
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.15
+ '@smithy/util-defaults-mode-node': 3.0.15
+ '@smithy/util-endpoints': 2.0.5
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/core@3.629.0:
+ resolution: {integrity: sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/core': 2.4.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/property-provider': 3.1.3
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/signature-v4': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-middleware': 3.0.3
+ fast-xml-parser: 4.4.1
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/credential-provider-cognito-identity@3.631.0:
+ resolution: {integrity: sha512-HU6K7m9R95Hu/oQlLgP77h6NmoT6ABEGAUTDZydPV2G9G5LW3ytOjzLNJT9zO99UGb6L3mIn2IB5LtHOzjthGw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/client-cognito-identity': 3.631.0
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-env@3.620.1:
+ resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/credential-provider-http@3.622.0:
+ resolution: {integrity: sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/property-provider': 3.1.3
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-stream': 3.1.3
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/credential-provider-ini@3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0):
+ resolution: {integrity: sha512-34NmRl6GYlyKTHwiA3C3MjCtmXfoaOXI8b2h7P9eAC8leuIb/51v482g0K6X5P5FqaGY8ZreUq5BMsGjBRr1uQ==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.631.0
+ dependencies:
+ '@aws-sdk/client-sts': 3.631.0
+ '@aws-sdk/credential-provider-env': 3.620.1
+ '@aws-sdk/credential-provider-http': 3.622.0
+ '@aws-sdk/credential-provider-process': 3.620.1
+ '@aws-sdk/credential-provider-sso': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)
+ '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/credential-provider-imds': 3.2.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-node@3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0):
+ resolution: {integrity: sha512-MlYcFknrMQ8RUVe0DMPE09mX8+97s7MLwnVV8l+LFi7m+ZfBz+h6LrohhOXC5elJHf4G3T0r/9Rwct63+zHK/w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.620.1
+ '@aws-sdk/credential-provider-http': 3.622.0
+ '@aws-sdk/credential-provider-ini': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/credential-provider-process': 3.620.1
+ '@aws-sdk/credential-provider-sso': 3.631.0(@aws-sdk/client-sso-oidc@3.631.0)
+ '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/credential-provider-imds': 3.2.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - '@aws-sdk/client-sts'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-process@3.620.1:
+ resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/credential-provider-sso@3.631.0(@aws-sdk/client-sso-oidc@3.631.0):
+ resolution: {integrity: sha512-k3Mj1Fc7faVOGR+qrwROir/8No35G7gbVL5FuY467x3y0ELa/6w0j/0HM+5eqzGABW7pSL/OHONhWKlYwg7Gkw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/client-sso': 3.631.0
+ '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.631.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.631.0):
+ resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.621.0
+ dependencies:
+ '@aws-sdk/client-sts': 3.631.0
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-bucket-endpoint@3.620.0:
+ resolution: {integrity: sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-arn-parser': 3.568.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-config-provider': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-expect-continue@3.620.0:
+ resolution: {integrity: sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-flexible-checksums@3.620.0:
+ resolution: {integrity: sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@aws-crypto/crc32c': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ '@smithy/is-array-buffer': 3.0.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-host-header@3.620.0:
+ resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-location-constraint@3.609.0:
+ resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-logger@3.609.0:
+ resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-recursion-detection@3.620.0:
+ resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-sdk-s3@3.629.0:
+ resolution: {integrity: sha512-FRXLcnPWXBoq/T9mnGnrpqhrSKNSm22rqJ0L7P14KESmbGuwhF/7ELYYxXIpgnIpb/CIUVmIU5EE8lsW1VTe8A==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/core': 3.629.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-arn-parser': 3.568.0
+ '@smithy/core': 2.4.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/signature-v4': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-config-provider': 3.0.0
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-stream': 3.1.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-ssec@3.609.0:
+ resolution: {integrity: sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/middleware-user-agent@3.631.0:
+ resolution: {integrity: sha512-mpFRFaP9fjXhw8NiRTP+lBPKRKMSKzfCyTXQXrQCSo4fAUaz8LPCc8VdqyoNmx4CLBTRflbEHLx5PfInA0DsrA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.631.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/region-config-resolver@3.614.0:
+ resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/types': 3.3.0
+ '@smithy/util-config-provider': 3.0.0
+ '@smithy/util-middleware': 3.0.3
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/signature-v4-multi-region@3.629.0:
+ resolution: {integrity: sha512-GPX6dnmuLGDFp7CsGqGCzleEoNyr9ekgOzSBtcL5nKX++NruxO7f1QzJAbcYvz0gdKvz958UO0EKsGM6hnkTSg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.629.0
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/signature-v4': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.631.0):
+ resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sso-oidc': ^3.614.0
+ dependencies:
+ '@aws-sdk/client-sso-oidc': 3.631.0(@aws-sdk/client-sts@3.631.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/types@3.609.0:
+ resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/util-arn-parser@3.568.0:
+ resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/util-endpoints@3.631.0:
+ resolution: {integrity: sha512-aavsyk17lK/r6rfVFYLh6/Y0eWvtbclWteJyW9PQLo5mpHPcTj6IbqMN4LHV27Y9IF7oOlbEAQ1CGTfpUlOvTg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-endpoints': 2.0.5
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/util-locate-window@3.568.0:
+ resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/util-user-agent-browser@3.609.0:
+ resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.3.0
+ bowser: 2.11.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/util-user-agent-node@3.614.0:
+ resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@aws-sdk/xml-builder@3.609.0:
+ resolution: {integrity: sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@babel/cli@7.24.8(@babel/core@7.25.2):
+ resolution: {integrity: sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==}
+ engines: {node: '>=6.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@jridgewell/trace-mapping': 0.3.25
+ commander: 6.2.1
+ convert-source-map: 2.0.0
+ fs-readdir-recursive: 1.1.0
+ glob: 7.2.3
+ make-dir: 2.1.0
+ slash: 2.0.0
+ optionalDependencies:
+ '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3
+ chokidar: 3.6.0
+ dev: false
+
+ /@babel/code-frame@7.24.7:
+ resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.24.7
+ picocolors: 1.0.1
+
+ /@babel/compat-data@7.25.2:
+ resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core@7.25.2:
+ resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.25.0
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helpers': 7.25.0
+ '@babel/parser': 7.25.3
+ '@babel/template': 7.25.0
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ convert-source-map: 2.0.0
+ debug: 4.3.6
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator@7.25.0:
+ resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.25.2
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+
+ /@babel/helper-annotate-as-pure@7.24.7:
+ resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.25.2
+ dev: false
+
+ /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7:
+ resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-compilation-targets@7.25.2:
+ resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.25.2
+ '@babel/helper-validator-option': 7.24.8
+ browserslist: 4.23.3
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-member-expression-to-functions': 7.24.8
+ '@babel/helper-optimise-call-expression': 7.24.7
+ '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/traverse': 7.25.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ regexpu-core: 5.3.2
+ semver: 6.3.1
+ dev: false
+
+ /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ debug: 4.3.6
+ lodash.debounce: 4.0.8
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-member-expression-to-functions@7.24.8:
+ resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-module-imports@7.24.7:
+ resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/helper-simple-access': 7.24.7
+ '@babel/helper-validator-identifier': 7.24.7
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-optimise-call-expression@7.24.7:
+ resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.25.2
+ dev: false
+
+ /@babel/helper-plugin-utils@7.24.8:
+ resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-wrap-function': 7.25.0
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-member-expression-to-functions': 7.24.8
+ '@babel/helper-optimise-call-expression': 7.24.7
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-simple-access@7.24.7:
+ resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-skip-transparent-expression-wrappers@7.24.7:
+ resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-string-parser@7.24.8:
+ resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier@7.24.7:
+ resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option@7.24.8:
+ resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-wrap-function@7.25.0:
+ resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.25.0
+ '@babel/traverse': 7.25.3
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helpers@7.25.0:
+ resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.25.0
+ '@babel/types': 7.25.2
+
+ /@babel/highlight@7.24.7:
+ resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.24.7
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.1
+
+ /@babel/parser@7.25.3:
+ resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.25.2
+
+ /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-external-helpers@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-IgK2yjWkxQhtc+UvSbUA8GfIDCQvs7FxqNtgLkmO5FAKos53sT2sl9bxeO4NxjcnZs27xnYIMyhjdXkNaZP4jA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2):
+ resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
+ engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==}
+ engines: {node: '>=6.9.0'}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.25.2
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ dev: false
+
+ /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2):
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2):
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2):
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2):
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2):
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2):
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2):
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2):
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2)
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2)
+ '@babel/traverse': 7.25.3
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/template': 7.25.0
+ dev: false
+
+ /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2):
+ resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2):
+ resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2):
+ resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-simple-access': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2):
+ resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-validator-identifier': 7.24.7
+ '@babel/traverse': 7.25.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2)
+ dev: false
+
+ /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2):
+ resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
+ '@babel/types': 7.25.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ regenerator-transform: 0.15.2
+ dev: false
+
+ /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2):
+ resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-annotate-as-pure': 7.24.7
+ '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2)
+ '@babel/helper-plugin-utils': 7.24.8
+ dev: false
+
+ /@babel/preset-env@7.25.3(@babel/core@7.25.2):
+ resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.25.2
+ '@babel/core': 7.25.2
+ '@babel/helper-compilation-targets': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-validator-option': 7.24.8
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2)
+ '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2)
+ '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2)
+ '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2)
+ babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2)
+ babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2)
+ core-js-compat: 3.38.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2):
+ resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/types': 7.25.2
+ esutils: 2.0.3
+ dev: false
+
+ /@babel/preset-react@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-validator-option': 7.24.8
+ '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/preset-typescript@7.24.7(@babel/core@7.25.2):
+ resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-plugin-utils': 7.24.8
+ '@babel/helper-validator-option': 7.24.8
+ '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2)
+ '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/regjsgen@0.8.0:
+ resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
+ dev: false
+
+ /@babel/runtime@7.25.0:
+ resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ /@babel/template@7.25.0:
+ resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/parser': 7.25.3
+ '@babel/types': 7.25.2
+
+ /@babel/traverse@7.25.3:
+ resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ '@babel/generator': 7.25.0
+ '@babel/parser': 7.25.3
+ '@babel/template': 7.25.0
+ '@babel/types': 7.25.2
+ debug: 4.3.6
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types@7.25.2:
+ resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.24.8
+ '@babel/helper-validator-identifier': 7.24.7
+ to-fast-properties: 2.0.0
+
+ /@bundled-es-modules/cookie@2.0.0:
+ resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==}
+ dependencies:
+ cookie: 0.5.0
+ dev: true
+
+ /@bundled-es-modules/statuses@1.0.1:
+ resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
+ dependencies:
+ statuses: 2.0.1
+ dev: true
+
+ /@commitlint/cli@17.7.2:
+ resolution: {integrity: sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg==}
+ engines: {node: '>=v14'}
+ hasBin: true
+ dependencies:
+ '@commitlint/format': 17.8.1
+ '@commitlint/lint': 17.8.1
+ '@commitlint/load': 17.8.1
+ '@commitlint/read': 17.8.1
+ '@commitlint/types': 17.8.1
+ execa: 5.1.1
+ lodash.isfunction: 3.0.9
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ dev: true
+
+ /@commitlint/config-conventional@17.7.0:
+ resolution: {integrity: sha512-iicqh2o6et+9kWaqsQiEYZzfLbtoWv9uZl8kbI8EGfnc0HeGafQBF7AJ0ylN9D/2kj6txltsdyQs8+2fTMwWEw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ conventional-changelog-conventionalcommits: 6.1.0
+ dev: true
+
+ /@commitlint/config-validator@17.8.1:
+ resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.8.1
+ ajv: 8.17.1
+ dev: true
+
+ /@commitlint/ensure@17.8.1:
+ resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.8.1
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
+ dev: true
+
+ /@commitlint/execute-rule@17.8.1:
+ resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/format@17.8.1:
+ resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.8.1
+ chalk: 4.1.2
+ dev: true
+
+ /@commitlint/is-ignored@17.8.1:
+ resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.8.1
+ semver: 7.5.4
+ dev: true
+
+ /@commitlint/lint@17.8.1:
+ resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/is-ignored': 17.8.1
+ '@commitlint/parse': 17.8.1
+ '@commitlint/rules': 17.8.1
+ '@commitlint/types': 17.8.1
+ dev: true
+
+ /@commitlint/load@17.8.1:
+ resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.8.1
+ '@commitlint/execute-rule': 17.8.1
+ '@commitlint/resolve-extends': 17.8.1
+ '@commitlint/types': 17.8.1
+ '@types/node': 20.5.1
+ chalk: 4.1.2
+ cosmiconfig: 8.3.6(typescript@5.2.2)
+ cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ resolve-from: 5.0.0
+ ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2)
+ typescript: 5.2.2
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ dev: true
+
+ /@commitlint/message@17.8.1:
+ resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/parse@17.8.1:
+ resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.8.1
+ conventional-changelog-angular: 6.0.0
+ conventional-commits-parser: 4.0.0
+ dev: true
+
+ /@commitlint/read@17.8.1:
+ resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/top-level': 17.8.1
+ '@commitlint/types': 17.8.1
+ fs-extra: 11.2.0
+ git-raw-commits: 2.0.11
+ minimist: 1.2.8
+ dev: true
+
+ /@commitlint/resolve-extends@17.8.1:
+ resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.8.1
+ '@commitlint/types': 17.8.1
+ import-fresh: 3.3.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ dev: true
+
+ /@commitlint/rules@17.8.1:
+ resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/ensure': 17.8.1
+ '@commitlint/message': 17.8.1
+ '@commitlint/to-lines': 17.8.1
+ '@commitlint/types': 17.8.1
+ execa: 5.1.1
+ dev: true
+
+ /@commitlint/to-lines@17.8.1:
+ resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/top-level@17.8.1:
+ resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ find-up: 5.0.0
+ dev: true
+
+ /@commitlint/types@17.8.1:
+ resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ chalk: 4.1.2
+ dev: true
+
+ /@cspotcode/source-map-support@0.8.1:
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+ dev: true
+
+ /@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1):
+ resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^2.4.1
+ dependencies:
+ '@csstools/css-tokenizer': 2.4.1
+ dev: true
+
+ /@csstools/css-tokenizer@2.4.1:
+ resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==}
+ engines: {node: ^14 || ^16 || >=18}
+ dev: true
+
+ /@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1):
+ resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^2.7.1
+ '@csstools/css-tokenizer': ^2.4.1
+ dependencies:
+ '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
+ '@csstools/css-tokenizer': 2.4.1
+ dev: true
+
+ /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2):
+ resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.10
+ dependencies:
+ postcss-selector-parser: 6.1.2
+ dev: true
+
+ /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2):
+ resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.13
+ dependencies:
+ postcss-selector-parser: 6.1.2
+ dev: true
+
+ /@ctrl/tinycolor@3.6.1:
+ resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /@emotion/babel-plugin@11.12.0:
+ resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==}
+ dependencies:
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/runtime': 7.25.0
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/serialize': 1.3.0
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@emotion/cache@11.13.1:
+ resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==}
+ dependencies:
+ '@emotion/memoize': 0.9.0
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.0
+ '@emotion/weak-memoize': 0.4.0
+ stylis: 4.2.0
+ dev: false
+
+ /@emotion/css@11.13.0:
+ resolution: {integrity: sha512-BUk99ylT+YHl+W/HN7nv1RCTkDYmKKqa1qbvM/qLSQEg61gipuBF5Hptk/2/ERmX2DCv0ccuFGhz9i0KSZOqPg==}
+ dependencies:
+ '@emotion/babel-plugin': 11.12.0
+ '@emotion/cache': 11.13.1
+ '@emotion/serialize': 1.3.0
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@emotion/hash@0.8.0:
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+ dev: false
+
+ /@emotion/hash@0.9.2:
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+ dev: false
+
+ /@emotion/is-prop-valid@0.8.8:
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+ requiresBuild: true
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ dev: false
+ optional: true
+
+ /@emotion/is-prop-valid@1.3.0:
+ resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==}
+ dependencies:
+ '@emotion/memoize': 0.9.0
+ dev: false
+
+ /@emotion/memoize@0.7.4:
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@emotion/memoize@0.9.0:
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+ dev: false
+
+ /@emotion/serialize@1.3.0:
+ resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==}
+ dependencies:
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/unitless': 0.9.0
+ '@emotion/utils': 1.4.0
+ csstype: 3.1.3
+ dev: false
+
+ /@emotion/sheet@1.4.0:
+ resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
+ dev: false
+
+ /@emotion/unitless@0.7.5:
+ resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+ dev: false
+
+ /@emotion/unitless@0.8.1:
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+ dev: false
+
+ /@emotion/unitless@0.9.0:
+ resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==}
+ dev: false
+
+ /@emotion/utils@1.4.0:
+ resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==}
+ dev: false
+
+ /@emotion/weak-memoize@0.4.0:
+ resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
+ dev: false
+
+ /@esbuild/android-arm64@0.18.20:
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/android-arm@0.18.20:
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/android-x64@0.18.20:
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.18.20:
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.18.20:
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.18.20:
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.18.20:
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.18.20:
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-arm@0.18.20:
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.18.20:
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.18.20:
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.18.20:
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.18.20:
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.18.20:
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.18.20:
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/linux-x64@0.18.20:
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.18.20:
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.18.20:
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.18.20:
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.18.20:
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.18.20:
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@esbuild/win32-x64@0.18.20:
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 8.51.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/regexpp@4.11.0:
+ resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.6
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js@8.51.0:
+ resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@faker-js/faker@8.1.0:
+ resolution: {integrity: sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'}
+ dev: true
+
+ /@fullcalendar/common@5.11.5:
+ resolution: {integrity: sha512-3iAYiUbHXhjSVXnYWz27Od2cslztUPsOwiwKlfGvQxBixv2Kl6a8IPwaijKFYJHXdwYmfPoEgK7rvqAGVoIYwA==}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@fullcalendar/core@6.1.9:
+ resolution: {integrity: sha512-eeG+z9BWerdsU9Ac6j16rpYpPnE0wxtnEHiHrh/u/ADbGTR3hCOjCD9PxQOfhOTHbWOVs7JQunGcksSPu5WZBQ==}
+ dependencies:
+ preact: 10.12.1
+ dev: false
+
+ /@fullcalendar/daygrid@6.1.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-o/6joH/7lmVHXAkbaa/tUbzWYnGp/LgfdiFyYPkqQbjKEeivNZWF1WhHqFbhx0zbFONSHtrvkjY2bjr+Ef2quQ==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ dev: false
+
+ /@fullcalendar/interaction@6.1.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-I3FGnv0kKZpIwujg3HllbKrciNjTqeTYy3oJG226oAn7lV6wnrrDYMmuGmA0jPJAGN46HKrQqKN7ItxQRDec4Q==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ dev: false
+
+ /@fullcalendar/list@6.1.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-OCKdC1Gz26cJ5QsXdQyXVyzVu23ypT2xzyAR+Wc8jEytcJLWXw2a914m/MVax8n8EHuaIYY2exhsy/eaSU0XNA==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ dev: false
+
+ /@fullcalendar/premium-common@6.1.15(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-IwUHptHNzWDOgAsXLoBntGxmbfCKvUy6iYFMCP3F3ahbG58E0PJMYsXvgw+NaA7Cz4gcQoVHioGjIFgQqs3Keg==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.15
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ dev: false
+
+ /@fullcalendar/react@6.1.9(@fullcalendar/core@6.1.9)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-ioxu0V++pYz2u/N1LL1V8DkMyiKGRun0gMAll2tQz3Kzi3r9pTwncGKRb1zO8h0e+TrInU08ywk/l5lBwp7eog==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ react: ^16.7.0 || ^17 || ^18
+ react-dom: ^16.7.0 || ^17 || ^18
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@fullcalendar/scrollgrid@6.1.15(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-z7q6eh9bUSQ60YwgztPlJzQAMr6XQgky6bxNQR9cMqfzcwyo/ww11G7OZUp840VIXyqT3g8XPziEDbS5zB4VVQ==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.15
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ '@fullcalendar/premium-common': 6.1.15(@fullcalendar/core@6.1.9)
+ dev: false
+
+ /@fullcalendar/timegrid@6.1.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-le7UV05wVE1Trdr054kgJXTwa+A1pEI8nlCBnPWdcyrL+dTLoPvQ4AWEVCnV7So+4zRYaCqnqGXfCJsj0RQa0g==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ '@fullcalendar/daygrid': 6.1.9(@fullcalendar/core@6.1.9)
+ dev: false
+
+ /@fullcalendar/timeline@6.1.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-0WuLvJpIsJZPYUuVlRsELdOUOuw6Tizer5pF93/EoHoQa7ZKMWvQY/6H+foxGXBszjHMFpIjRFlltDytL9VbGQ==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ '@fullcalendar/premium-common': 6.1.15(@fullcalendar/core@6.1.9)
+ '@fullcalendar/scrollgrid': 6.1.15(@fullcalendar/core@6.1.9)
+ dev: false
+
+ /@humanwhocodes/config-array@0.11.14:
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+ engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.6
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
+ dev: true
+
+ /@iconify/react@4.1.1(react@18.2.0):
+ resolution: {integrity: sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==}
+ peerDependencies:
+ react: '>=16'
+ dependencies:
+ '@iconify/types': 2.0.0
+ react: 18.2.0
+ dev: false
+
+ /@iconify/types@2.0.0:
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+ dev: false
+
+ /@inquirer/confirm@3.1.22:
+ resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/core': 9.0.10
+ '@inquirer/type': 1.5.2
+ dev: true
+
+ /@inquirer/core@9.0.10:
+ resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@inquirer/figures': 1.0.5
+ '@inquirer/type': 1.5.2
+ '@types/mute-stream': 0.0.4
+ '@types/node': 22.4.1
+ '@types/wrap-ansi': 3.0.0
+ ansi-escapes: 4.3.2
+ cli-spinners: 2.9.2
+ cli-width: 4.1.0
+ mute-stream: 1.0.0
+ signal-exit: 4.1.0
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ dev: true
+
+ /@inquirer/figures@1.0.5:
+ resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /@inquirer/type@1.5.2:
+ resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==}
+ engines: {node: '>=18'}
+ dependencies:
+ mute-stream: 1.0.0
+ dev: true
+
+ /@isaacs/cliui@8.0.2:
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: /string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: /strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: /wrap-ansi@7.0.0
+ dev: true
+
+ /@jridgewell/gen-mapping@0.3.5:
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/source-map@0.3.6:
+ resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@jridgewell/sourcemap-codec@1.5.0:
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ /@jridgewell/trace-mapping@0.3.25:
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ /@jridgewell/trace-mapping@0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+ dev: true
+
+ /@mrmlnc/readdir-enhanced@2.2.1:
+ resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==}
+ engines: {node: '>=4'}
+ dependencies:
+ call-me-maybe: 1.0.2
+ glob-to-regexp: 0.3.0
+ dev: true
+
+ /@mswjs/cookies@1.1.1:
+ resolution: {integrity: sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /@mswjs/interceptors@0.26.15:
+ resolution: {integrity: sha512-HM47Lu1YFmnYHKMBynFfjCp0U/yRskHj/8QEJW0CBEPOlw8Gkmjfll+S9b8M7V5CNDw2/ciRxjjnWeaCiblSIQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/logger': 0.3.0
+ '@open-draft/until': 2.1.0
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ strict-event-emitter: 0.5.1
+ dev: true
+
+ /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3:
+ resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@1.1.3:
+ resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+ dev: true
+
+ /@open-draft/deferred-promise@2.2.0:
+ resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+ dev: true
+
+ /@open-draft/logger@0.3.0:
+ resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+ dependencies:
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ dev: true
+
+ /@open-draft/until@2.1.0:
+ resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+ dev: true
+
+ /@pkgjs/parseargs@0.11.0:
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rc-component/async-validator@5.0.4:
+ resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==}
+ engines: {node: '>=14.x'}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /@rc-component/color-picker@2.0.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@ant-design/fast-color': 2.0.6
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/context@1.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/mini-decimal@1.1.0:
+ resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==}
+ engines: {node: '>=8.x'}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /@rc-component/mutate-observer@1.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/portal@1.1.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/qrcode@1.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/tour@1.15.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@rc-component/trigger@2.2.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-fuU11J8pOt6+U/tU6/CAv8wjCwGaNeRk9f5k8HQth7JBbJ6MMH62WhGycVW75VnXfBZgL/7kO+wbiO2Xc9U9sQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@remix-run/router@1.9.0:
+ resolution: {integrity: sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==}
+ engines: {node: '>=14.0.0'}
+ dev: false
+
+ /@smithy/abort-controller@3.1.1:
+ resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/chunked-blob-reader-native@3.0.0:
+ resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==}
+ dependencies:
+ '@smithy/util-base64': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/chunked-blob-reader@3.0.0:
+ resolution: {integrity: sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/config-resolver@3.0.5:
+ resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/types': 3.3.0
+ '@smithy/util-config-provider': 3.0.0
+ '@smithy/util-middleware': 3.0.3
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/core@2.4.0:
+ resolution: {integrity: sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-retry': 3.0.15
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/credential-provider-imds@3.2.0:
+ resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/property-provider': 3.1.3
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/eventstream-codec@3.1.2:
+ resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==}
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-hex-encoding': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/eventstream-serde-browser@3.0.6:
+ resolution: {integrity: sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/eventstream-serde-universal': 3.0.5
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/eventstream-serde-config-resolver@3.0.3:
+ resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/eventstream-serde-node@3.0.5:
+ resolution: {integrity: sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/eventstream-serde-universal': 3.0.5
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/eventstream-serde-universal@3.0.5:
+ resolution: {integrity: sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/eventstream-codec': 3.1.2
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/fetch-http-handler@3.2.4:
+ resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==}
+ dependencies:
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/querystring-builder': 3.0.3
+ '@smithy/types': 3.3.0
+ '@smithy/util-base64': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/hash-blob-browser@3.1.2:
+ resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==}
+ dependencies:
+ '@smithy/chunked-blob-reader': 3.0.0
+ '@smithy/chunked-blob-reader-native': 3.0.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/hash-node@3.0.3:
+ resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/hash-stream-node@3.1.2:
+ resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/invalid-dependency@3.0.3:
+ resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/is-array-buffer@2.2.0:
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/is-array-buffer@3.0.0:
+ resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/md5-js@3.0.3:
+ resolution: {integrity: sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==}
+ dependencies:
+ '@smithy/types': 3.3.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/middleware-content-length@3.0.5:
+ resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/middleware-endpoint@3.1.0:
+ resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/middleware-serde': 3.0.3
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ '@smithy/url-parser': 3.0.3
+ '@smithy/util-middleware': 3.0.3
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/middleware-retry@3.0.15:
+ resolution: {integrity: sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/service-error-classification': 3.0.3
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-retry': 3.0.3
+ tslib: 2.6.3
+ uuid: 9.0.1
+ dev: false
+
+ /@smithy/middleware-serde@3.0.3:
+ resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/middleware-stack@3.0.3:
+ resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/node-config-provider@3.1.4:
+ resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/property-provider': 3.1.3
+ '@smithy/shared-ini-file-loader': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/node-http-handler@3.1.4:
+ resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/abort-controller': 3.1.1
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/querystring-builder': 3.0.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/property-provider@3.1.3:
+ resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/protocol-http@4.1.0:
+ resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/querystring-builder@3.0.3:
+ resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ '@smithy/util-uri-escape': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/querystring-parser@3.0.3:
+ resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/service-error-classification@3.0.3:
+ resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ dev: false
+
+ /@smithy/shared-ini-file-loader@3.1.4:
+ resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/signature-v4@4.1.0:
+ resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 3.0.0
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-hex-encoding': 3.0.0
+ '@smithy/util-middleware': 3.0.3
+ '@smithy/util-uri-escape': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/smithy-client@3.2.0:
+ resolution: {integrity: sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/middleware-endpoint': 3.1.0
+ '@smithy/middleware-stack': 3.0.3
+ '@smithy/protocol-http': 4.1.0
+ '@smithy/types': 3.3.0
+ '@smithy/util-stream': 3.1.3
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/types@3.3.0:
+ resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/url-parser@3.0.3:
+ resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==}
+ dependencies:
+ '@smithy/querystring-parser': 3.0.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-base64@3.0.0:
+ resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-body-length-browser@3.0.0:
+ resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-body-length-node@3.0.0:
+ resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-buffer-from@2.2.0:
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-buffer-from@3.0.0:
+ resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-config-provider@3.0.0:
+ resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-defaults-mode-browser@3.0.15:
+ resolution: {integrity: sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@smithy/property-provider': 3.1.3
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ bowser: 2.11.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-defaults-mode-node@3.0.15:
+ resolution: {integrity: sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@smithy/config-resolver': 3.0.5
+ '@smithy/credential-provider-imds': 3.2.0
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/property-provider': 3.1.3
+ '@smithy/smithy-client': 3.2.0
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-endpoints@2.0.5:
+ resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.4
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-hex-encoding@3.0.0:
+ resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-middleware@3.0.3:
+ resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-retry@3.0.3:
+ resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/service-error-classification': 3.0.3
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-stream@3.1.3:
+ resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/fetch-http-handler': 3.2.4
+ '@smithy/node-http-handler': 3.1.4
+ '@smithy/types': 3.3.0
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-hex-encoding': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-uri-escape@3.0.0:
+ resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-utf8@2.3.0:
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 2.2.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-utf8@3.0.0:
+ resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 3.0.0
+ tslib: 2.6.3
+ dev: false
+
+ /@smithy/util-waiter@3.1.2:
+ resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/abort-controller': 3.1.1
+ '@smithy/types': 3.3.0
+ tslib: 2.6.3
+ dev: false
+
+ /@tanstack/query-core@5.50.1:
+ resolution: {integrity: sha512-lpfhKPrJlyV2DSVcQb/HuozH3Av3kws4ge22agx+lNGpFkS4vLZ7St0l3GLwlAD+bqB+qXGex3JdRKUNtMviEQ==}
+ dev: false
+
+ /@tanstack/query-devtools@5.50.1:
+ resolution: {integrity: sha512-MQ5JK3yRwBP1SRuwoJVPGZP4cMLXCQ0t+6blDbcAVGEoqrEuvbgTdwlN729AKBR0hidOWPFR9n5YpI2Y8bBZOQ==}
+ dev: false
+
+ /@tanstack/react-query-devtools@5.50.1(@tanstack/react-query@5.50.1)(react@18.2.0):
+ resolution: {integrity: sha512-zgPmEFv9GhLAx6eaf9r0ACbcxit1ZSuv/uPpOXBTTSPLijlWcfpQTOdZx0jYQ14t2cUfWjrAW41cUmcCvT4X/g==}
+ peerDependencies:
+ '@tanstack/react-query': ^5.50.1
+ react: ^18 || ^19
+ dependencies:
+ '@tanstack/query-devtools': 5.50.1
+ '@tanstack/react-query': 5.50.1(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
+ /@tanstack/react-query@5.50.1(react@18.2.0):
+ resolution: {integrity: sha512-s0DW3rVBDPReDDovUjVqItVa3R2nPfUANK9nqGvarO2DwTiY9U4EBTsqizMxItRCoGgK5apeM7D3mxlHrSKpdQ==}
+ peerDependencies:
+ react: ^18.0.0
+ dependencies:
+ '@tanstack/query-core': 5.50.1
+ react: 18.2.0
+ dev: false
+
+ /@trysound/sax@0.2.0:
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+ dev: true
+
+ /@tsconfig/node10@1.0.11:
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+ dev: true
+
+ /@tsconfig/node12@1.0.11:
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+ dev: true
+
+ /@tsconfig/node14@1.0.3:
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ dev: true
+
+ /@tsconfig/node16@1.0.4:
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+ dev: true
+
+ /@types/autosuggest-highlight@3.2.0:
+ resolution: {integrity: sha512-bTcsL4YYypjhKfPaImxuoMPiTyiUp7VGKytMr15/413IoazrOIfV/gca2ysI/IW0ftZYCPI5xppRm6IVX1Efqw==}
+ dev: true
+
+ /@types/babel__core@7.20.5:
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+ dependencies:
+ '@babel/parser': 7.25.3
+ '@babel/types': 7.25.2
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+ dev: false
+
+ /@types/babel__generator@7.6.8:
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+ dependencies:
+ '@babel/types': 7.25.2
+ dev: false
+
+ /@types/babel__template@7.4.4:
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+ dependencies:
+ '@babel/parser': 7.25.3
+ '@babel/types': 7.25.2
+ dev: false
+
+ /@types/babel__traverse@7.20.6:
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+ dependencies:
+ '@babel/types': 7.25.2
+ dev: false
+
+ /@types/color-convert@2.0.3:
+ resolution: {integrity: sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==}
+ dependencies:
+ '@types/color-name': 1.1.4
+ dev: true
+
+ /@types/color-name@1.1.4:
+ resolution: {integrity: sha512-hulKeREDdLFesGQjl96+4aoJSHY5b2GRjagzzcqCfIrWhe5vkCqIvrLbqzBaI1q94Vg8DNJZZqTR5ocdWmWclg==}
+ dev: true
+
+ /@types/color@3.0.4:
+ resolution: {integrity: sha512-OpisS4bqJJwbkkQRrMvURf3DOxBoAg9mysHYI7WgrWpSYHqHGKYBULHdz4ih77SILcLDo/zyHGFyfIl9yb8NZQ==}
+ dependencies:
+ '@types/color-convert': 2.0.3
+ dev: true
+
+ /@types/cookie@0.6.0:
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+ dev: true
+
+ /@types/debug@4.1.12:
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ dependencies:
+ '@types/ms': 0.7.34
+ dev: false
+
+ /@types/glob@7.2.0:
+ resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
+ dependencies:
+ '@types/minimatch': 5.1.2
+ '@types/node': 22.4.1
+ dev: true
+
+ /@types/hast@2.3.10:
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/history@4.7.11:
+ resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
+ dev: true
+
+ /@types/hoist-non-react-statics@3.3.5:
+ resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==}
+ dependencies:
+ '@types/react': 18.2.28
+ hoist-non-react-statics: 3.3.2
+
+ /@types/js-cookie@2.2.7:
+ resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
+ dev: false
+
+ /@types/json-schema@7.0.15:
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/lodash-es@4.17.12:
+ resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+ dependencies:
+ '@types/lodash': 4.17.7
+ dev: false
+
+ /@types/lodash@4.17.7:
+ resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==}
+ dev: false
+
+ /@types/mdast@3.0.15:
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/minimatch@5.1.2:
+ resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
+ dev: true
+
+ /@types/minimist@1.2.5:
+ resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+ dev: true
+
+ /@types/ms@0.7.34:
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+ dev: false
+
+ /@types/mute-stream@0.0.4:
+ resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==}
+ dependencies:
+ '@types/node': 22.4.1
+ dev: true
+
+ /@types/node@20.5.1:
+ resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==}
+ dev: true
+
+ /@types/node@22.4.1:
+ resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==}
+ dependencies:
+ undici-types: 6.19.6
+
+ /@types/normalize-package-data@2.4.4:
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+ dev: true
+
+ /@types/nprogress@0.2.1:
+ resolution: {integrity: sha512-TYuyVnp+nOnimgdOydDIDYIxv2kSeuJZw4tF0p/KG7hpzcMF1WkHaREwM8O4blqfT1F7rq0nht6Ko2KVUfWzBA==}
+ dev: true
+
+ /@types/numeral@2.0.3:
+ resolution: {integrity: sha512-37VDYvFbx/I+Ve1kwcDUq5+qvgNl+uy9YUZhBMJ6YWHBtr2+d6CAgdn4R81NqBlZbTpvLxJOTUhwbki7+90+qQ==}
+ dev: true
+
+ /@types/parse-json@4.0.2:
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+ dev: false
+
+ /@types/parse5@6.0.3:
+ resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
+ dev: false
+
+ /@types/prop-types@15.7.12:
+ resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+
+ /@types/qs@6.9.15:
+ resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
+ dev: false
+
+ /@types/quill@1.3.10:
+ resolution: {integrity: sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==}
+ dependencies:
+ parchment: 1.1.4
+ dev: false
+
+ /@types/ramda@0.29.6:
+ resolution: {integrity: sha512-4XQ9hYQhCwOxfkoTsIPvDVXc75fY5+MLQHUpExX6ByvU1q+0vOYRLSjWAt1IydkE1hOuhwMH6KvV/9rhzgrvRw==}
+ dependencies:
+ types-ramda: 0.29.10
+ dev: true
+
+ /@types/react-beautiful-dnd@13.1.6:
+ resolution: {integrity: sha512-FXAuaa52ux7HWQDumi3MFSAAsW8OKfDImy1pSZPKe85nV9mZ1f4spVzW0a2boYvkIhphjbWUi5EwUiRG8Rq/Qg==}
+ dependencies:
+ '@types/react': 18.2.28
+ dev: true
+
+ /@types/react-dom@18.2.13:
+ resolution: {integrity: sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==}
+ dependencies:
+ '@types/react': 18.2.28
+ dev: true
+
+ /@types/react-redux@7.1.33:
+ resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==}
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.5
+ '@types/react': 18.2.28
+ hoist-non-react-statics: 3.3.2
+ redux: 4.2.1
+ dev: false
+
+ /@types/react-router-dom@5.3.3:
+ resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 18.2.28
+ '@types/react-router': 5.1.20
+ dev: true
+
+ /@types/react-router@5.1.20:
+ resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 18.2.28
+ dev: true
+
+ /@types/react@18.2.28:
+ resolution: {integrity: sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==}
+ dependencies:
+ '@types/prop-types': 15.7.12
+ '@types/scheduler': 0.23.0
+ csstype: 3.1.3
+
+ /@types/scheduler@0.23.0:
+ resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==}
+
+ /@types/semver@7.5.8:
+ resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+ dev: true
+
+ /@types/statuses@2.0.5:
+ resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==}
+ dev: true
+
+ /@types/styled-components@5.1.28:
+ resolution: {integrity: sha512-nu0VKNybkjvUqJAXWtRqKd7j3iRUl8GbYSTvZNuIBJcw/HUp1Y4QUXNLlj7gcnRV/t784JnHAlvRnSnE3nPbJA==}
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.5
+ '@types/react': 18.2.28
+ csstype: 3.1.3
+ dev: true
+
+ /@types/stylis@4.2.6:
+ resolution: {integrity: sha512-4nebF2ZJGzQk0ka0O6+FZUWceyFv4vWq/0dXBMmrSeAwzOuOd/GxE5Pa64d/ndeNLG73dXoBsRzvtsVsYUv6Uw==}
+ dev: false
+
+ /@types/svgo@2.6.4:
+ resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+ dependencies:
+ '@types/node': 22.4.1
+ dev: true
+
+ /@types/unist@2.0.11:
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ /@types/unist@3.0.3:
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+ dev: true
+
+ /@types/vfile-message@2.0.0:
+ resolution: {integrity: sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==}
+ deprecated: This is a stub types definition. vfile-message provides its own type definitions, so you do not need this installed.
+ dependencies:
+ vfile-message: 4.0.2
+ dev: true
+
+ /@types/vfile@3.0.2:
+ resolution: {integrity: sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==}
+ dependencies:
+ '@types/node': 22.4.1
+ '@types/unist': 2.0.11
+ '@types/vfile-message': 2.0.0
+ dev: true
+
+ /@types/wrap-ansi@3.0.0:
+ resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==}
+ dev: true
+
+ /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2):
+ resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.11.0
+ '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ debug: 4.3.6
+ eslint: 8.51.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare-lite: 1.4.0
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.2.2)
+ typescript: 5.2.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@5.2.2):
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
+ debug: 4.3.6
+ eslint: 8.51.0
+ typescript: 5.2.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager@5.62.0:
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ dev: true
+
+ /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@5.2.2):
+ resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ debug: 4.3.6
+ eslint: 8.51.0
+ tsutils: 3.21.0(typescript@5.2.2)
+ typescript: 5.2.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types@5.62.0:
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2):
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.3.6
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.2.2)
+ typescript: 5.2.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2):
+ resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.5.8
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
+ eslint: 8.51.0
+ eslint-scope: 5.1.1
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys@5.62.0:
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@vercel/analytics@1.2.2(react@18.2.0):
+ resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==}
+ peerDependencies:
+ next: '>= 13'
+ react: ^18 || ^19
+ peerDependenciesMeta:
+ next:
+ optional: true
+ react:
+ optional: true
+ dependencies:
+ react: 18.2.0
+ server-only: 0.0.1
+ dev: false
+
+ /@vitejs/plugin-react@4.1.0(vite@4.4.11):
+ resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.14.2
+ vite: 4.4.11(@types/node@22.4.1)(sass@1.69.3)(terser@5.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@xobotyi/scrollbar-width@1.9.5:
+ resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==}
+ dev: false
+
+ /@yr/monotone-cubic-spline@1.0.3:
+ resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==}
+ dev: false
+
+ /JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.12.1):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.12.1
+ dev: true
+
+ /acorn-walk@8.3.3:
+ resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
+ engines: {node: '>=0.4.0'}
+ dependencies:
+ acorn: 8.12.1
+ dev: true
+
+ /acorn@8.12.1:
+ resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.1
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ dev: true
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-escapes@5.0.0:
+ resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==}
+ engines: {node: '>=12'}
+ dependencies:
+ type-fest: 1.4.0
+ dev: true
+
+ /ansi-regex@2.1.1:
+ resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-regex@6.0.1:
+ resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /ansi-styles@2.2.1:
+ resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /antd@5.20.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-YjVCYAfBjrTyNKsg+heAOR0Gm4qJNJoBZQcV1h1BX/ufwoLx0PC5RGs75g6gQFy/1nv8OrJH7DXUGdtwPMB3Vg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@ant-design/colors': 7.1.0
+ '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/cssinjs-utils': 1.0.3(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/icons': 5.4.0(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/react-slick': 1.1.2(react@18.2.0)
+ '@babel/runtime': 7.25.0
+ '@ctrl/tinycolor': 3.6.1
+ '@rc-component/color-picker': 2.0.1(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/qrcode': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/tour': 1.15.0(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.5.1
+ copy-to-clipboard: 3.3.3
+ dayjs: 1.11.12
+ rc-cascader: 3.27.0(react-dom@18.2.0)(react@18.2.0)
+ rc-checkbox: 3.3.0(react-dom@18.2.0)(react@18.2.0)
+ rc-collapse: 3.7.3(react-dom@18.2.0)(react@18.2.0)
+ rc-dialog: 9.5.2(react-dom@18.2.0)(react@18.2.0)
+ rc-drawer: 7.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-dropdown: 4.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-field-form: 2.3.0(react-dom@18.2.0)(react@18.2.0)
+ rc-image: 7.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0)
+ rc-input-number: 9.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-mentions: 2.15.0(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-notification: 5.6.0(react-dom@18.2.0)(react@18.2.0)
+ rc-pagination: 4.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-picker: 4.6.13(dayjs@1.11.12)(react-dom@18.2.0)(react@18.2.0)
+ rc-progress: 4.0.0(react-dom@18.2.0)(react@18.2.0)
+ rc-rate: 2.13.0(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-segmented: 2.3.0(react-dom@18.2.0)(react@18.2.0)
+ rc-select: 14.15.1(react-dom@18.2.0)(react@18.2.0)
+ rc-slider: 11.1.5(react-dom@18.2.0)(react@18.2.0)
+ rc-steps: 6.0.1(react-dom@18.2.0)(react@18.2.0)
+ rc-switch: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+ rc-table: 7.45.7(react-dom@18.2.0)(react@18.2.0)
+ rc-tabs: 15.1.1(react-dom@18.2.0)(react@18.2.0)
+ rc-textarea: 1.8.1(react-dom@18.2.0)(react@18.2.0)
+ rc-tooltip: 6.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.8.8(react-dom@18.2.0)(react@18.2.0)
+ rc-tree-select: 5.22.1(react-dom@18.2.0)(react@18.2.0)
+ rc-upload: 4.6.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ scroll-into-view-if-needed: 3.1.0
+ throttle-debounce: 5.0.2
+ transitivePeerDependencies:
+ - date-fns
+ - luxon
+ - moment
+ dev: false
+
+ /any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ /apexcharts@3.43.0:
+ resolution: {integrity: sha512-YPw1aLatPQMUqVLMp5d+LDaXFi4QrRQND72/XO7/2NJdg+R5MjE9sifJ0GzOfgoZM7ltBUTjwfSxIvwR/9V8yw==}
+ dependencies:
+ '@yr/monotone-cubic-spline': 1.0.3
+ svg.draggable.js: 2.2.2
+ svg.easing.js: 2.0.0
+ svg.filter.js: 2.0.2
+ svg.pathmorphing.js: 0.1.3
+ svg.resize.js: 1.4.3
+ svg.select.js: 3.0.1
+ dev: false
+
+ /arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ dev: true
+
+ /arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: true
+
+ /argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /arr-diff@4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-flatten@1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /arr-union@3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+ dev: true
+
+ /array-find-index@1.0.2:
+ resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+ dev: true
+
+ /array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ is-string: 1.0.7
+ dev: true
+
+ /array-tree-filter@2.1.0:
+ resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
+ dev: false
+
+ /array-union@1.0.2:
+ resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-uniq: 1.0.3
+ dev: true
+
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array-uniq@1.0.3:
+ resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array-unique@0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
+ dev: true
+
+ /arrify@1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /assign-symbols@1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ast-types-flow@0.0.7:
+ resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
+ dev: true
+
+ /astral-regex@1.0.0:
+ resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /astral-regex@2.0.0:
+ resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ dev: false
+
+ /atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+ dev: true
+
+ /autoprefixer@10.4.16(postcss@8.4.31):
+ resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+ dependencies:
+ browserslist: 4.23.3
+ caniuse-lite: 1.0.30001651
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.0.1
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /autoprefixer@9.8.8:
+ resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==}
+ hasBin: true
+ dependencies:
+ browserslist: 4.23.3
+ caniuse-lite: 1.0.30001651
+ normalize-range: 0.1.2
+ num2fraction: 1.2.2
+ picocolors: 0.2.1
+ postcss: 7.0.39
+ postcss-value-parser: 4.2.0
+ dev: true
+
+ /autosuggest-highlight@3.3.4:
+ resolution: {integrity: sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==}
+ dependencies:
+ remove-accents: 0.4.4
+ dev: false
+
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.0.0
+ dev: true
+
+ /axe-core@4.10.0:
+ resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axios@1.5.1:
+ resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==}
+ dependencies:
+ follow-redirects: 1.15.6
+ form-data: 4.0.0
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /axobject-query@3.2.4:
+ resolution: {integrity: sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ cosmiconfig: 7.1.0
+ resolve: 1.22.8
+ dev: false
+
+ /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2):
+ resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/compat-data': 7.25.2
+ '@babel/core': 7.25.2
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2):
+ resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2)
+ core-js-compat: 3.38.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2):
+ resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.25.2
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /bail@1.0.5:
+ resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==}
+ dev: true
+
+ /bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+ dev: false
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ /balanced-match@2.0.0:
+ resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+ dev: true
+
+ /base@0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.1
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+ dev: true
+
+ /big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+ dev: true
+
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ /bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: true
+
+ /boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ dev: true
+
+ /bowser@2.11.0:
+ resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
+ dev: false
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.1.1
+
+ /browserslist@4.23.3:
+ resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001651
+ electron-to-chromium: 1.5.11
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.0(browserslist@4.23.3)
+
+ /buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ /cache-base@1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.1
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+ dev: true
+
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
+
+ /call-me-maybe@1.0.2:
+ resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
+ dev: true
+
+ /caller-callsite@2.0.0:
+ resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ callsites: 2.0.0
+ dev: true
+
+ /caller-path@2.0.0:
+ resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==}
+ engines: {node: '>=4'}
+ dependencies:
+ caller-callsite: 2.0.0
+ dev: true
+
+ /callsites@2.0.0:
+ resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ /camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /camelcase-keys@4.2.0:
+ resolution: {integrity: sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ camelcase: 4.1.0
+ map-obj: 2.0.0
+ quick-lru: 1.1.0
+ dev: true
+
+ /camelcase-keys@6.2.2:
+ resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ map-obj: 4.3.0
+ quick-lru: 4.0.1
+ dev: true
+
+ /camelcase-keys@7.0.2:
+ resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==}
+ engines: {node: '>=12'}
+ dependencies:
+ camelcase: 6.3.0
+ map-obj: 4.3.0
+ quick-lru: 5.1.1
+ type-fest: 1.4.0
+ dev: true
+
+ /camelcase@4.1.0:
+ resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+ dev: false
+
+ /caniuse-lite@1.0.30001651:
+ resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==}
+
+ /ccount@1.1.0:
+ resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==}
+ dev: true
+
+ /ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+ dev: false
+
+ /chalk@1.1.3:
+ resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-styles: 2.2.1
+ escape-string-regexp: 1.0.5
+ has-ansi: 2.0.0
+ strip-ansi: 3.0.1
+ supports-color: 2.0.0
+ dev: true
+
+ /chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /character-entities-html4@1.1.4:
+ resolution: {integrity: sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==}
+ dev: true
+
+ /character-entities-legacy@1.1.4:
+ resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+ dev: true
+
+ /character-entities@1.2.4:
+ resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+ dev: true
+
+ /character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ dev: false
+
+ /character-reference-invalid@1.1.4:
+ resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+ dev: true
+
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /class-utils@0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+ dev: true
+
+ /classnames@2.3.2:
+ resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+ dev: false
+
+ /classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+ dev: false
+
+ /cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ restore-cursor: 4.0.0
+ dev: true
+
+ /cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /cli-truncate@3.1.0:
+ resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 5.1.2
+ dev: true
+
+ /cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+ dev: true
+
+ /cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone-regexp@1.0.1:
+ resolution: {integrity: sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-regexp: 1.0.0
+ is-supported-regexp-flag: 1.0.1
+ dev: true
+
+ /clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ /collapse-white-space@1.0.6:
+ resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==}
+ dev: true
+
+ /collection-visit@1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+ dev: true
+
+ /color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+
+ /color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+ dev: false
+
+ /color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+ dev: false
+
+ /colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+ dev: true
+
+ /colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ dev: true
+
+ /combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+ dev: false
+
+ /comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+ dev: false
+
+ /commander@11.0.0:
+ resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ /commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /commander@6.2.1:
+ resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+ dev: true
+
+ /component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+ dev: true
+
+ /compute-scroll-into-view@3.1.0:
+ resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==}
+ dev: false
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ /confusing-browser-globals@1.0.11:
+ resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
+ dev: true
+
+ /conventional-changelog-angular@6.0.0:
+ resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==}
+ engines: {node: '>=14'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-changelog-conventionalcommits@6.1.0:
+ resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==}
+ engines: {node: '>=14'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-commits-parser@4.0.0:
+ resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 1.0.1
+ meow: 8.1.2
+ split2: 3.2.2
+ dev: true
+
+ /convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+ dev: false
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ /cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /copy-descriptor@0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+ dependencies:
+ toggle-selection: 1.0.6
+ dev: false
+
+ /core-js-compat@3.38.0:
+ resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==}
+ dependencies:
+ browserslist: 4.23.3
+ dev: false
+
+ /cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+ dev: true
+
+ /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2):
+ resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==}
+ engines: {node: '>=v14.21.3'}
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=7'
+ ts-node: '>=10'
+ typescript: '>=4'
+ dependencies:
+ '@types/node': 20.5.1
+ cosmiconfig: 8.3.6(typescript@5.2.2)
+ ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2)
+ typescript: 5.2.2
+ dev: true
+
+ /cosmiconfig@5.2.1:
+ resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==}
+ engines: {node: '>=4'}
+ dependencies:
+ import-fresh: 2.0.0
+ is-directory: 0.3.1
+ js-yaml: 3.14.1
+ parse-json: 4.0.0
+ dev: true
+
+ /cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: false
+
+ /cosmiconfig@8.3.6(typescript@5.2.2):
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ typescript: 5.2.2
+ dev: true
+
+ /create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ dev: true
+
+ /cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /css-box-model@1.2.1:
+ resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
+ dependencies:
+ tiny-invariant: 1.3.3
+ dev: false
+
+ /css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /css-functions-list@3.2.2:
+ resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==}
+ engines: {node: '>=12 || >=16'}
+ dev: true
+
+ /css-in-js-utils@3.1.0:
+ resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ dependencies:
+ hyphenate-style-name: 1.1.0
+ dev: false
+
+ /css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
+ dev: true
+
+ /css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+
+ /css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.0
+ dev: true
+
+ /css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /csso@4.2.0:
+ resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ css-tree: 1.1.3
+ dev: true
+
+ /csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ /currently-unhandled@0.4.1:
+ resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-find-index: 1.0.2
+ dev: true
+
+ /damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: true
+
+ /dargs@7.0.0:
+ resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /dayjs@1.11.10:
+ resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
+ dev: false
+
+ /dayjs@1.11.12:
+ resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==}
+ dev: false
+
+ /debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+ dev: true
+
+ /debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /debug@4.3.6:
+ resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+
+ /decamelize-keys@1.1.1:
+ resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decamelize: 1.2.0
+ map-obj: 1.0.1
+ dev: true
+
+ /decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /decamelize@5.0.1:
+ resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+ dependencies:
+ character-entities: 2.0.2
+ dev: false
+
+ /decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /deep-equal@1.1.2:
+ resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-arguments: 1.1.1
+ is-date-object: 1.0.5
+ is-regex: 1.1.4
+ object-is: 1.1.6
+ object-keys: 1.1.1
+ regexp.prototype.flags: 1.5.2
+ dev: false
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+
+ /define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ /define-property@0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 0.1.7
+ dev: true
+
+ /define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.3
+ dev: true
+
+ /define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.3
+ isobject: 3.0.1
+ dev: true
+
+ /delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+ dev: false
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ /didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ dev: true
+
+ /diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
+ /diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+ dev: false
+
+ /dir-glob@2.2.2:
+ resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==}
+ engines: {node: '>=4'}
+ dependencies:
+ path-type: 3.0.0
+ dev: true
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dev: true
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-serializer@0.2.2:
+ resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+ dependencies:
+ domelementtype: 2.3.0
+ entities: 2.2.0
+ dev: true
+
+ /dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+ dev: true
+
+ /domelementtype@1.3.1:
+ resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+ dev: true
+
+ /domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ dev: true
+
+ /domhandler@2.4.2:
+ resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+ dependencies:
+ domelementtype: 1.3.1
+ dev: true
+
+ /domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: true
+
+ /domutils@1.7.0:
+ resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+ dependencies:
+ dom-serializer: 0.2.2
+ domelementtype: 1.3.1
+ dev: true
+
+ /domutils@2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+ dependencies:
+ dom-serializer: 1.4.1
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ dev: true
+
+ /dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ dev: true
+
+ /electron-to-chromium@1.5.11:
+ resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==}
+
+ /emoji-regex@7.0.3:
+ resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==}
+ dev: true
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /entities@1.1.2:
+ resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+ dev: true
+
+ /entities@2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+ dev: true
+
+ /error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+
+ /error-stack-parser@2.1.4:
+ resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+ dependencies:
+ stackframe: 1.3.4
+ dev: false
+
+ /es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
+ globalthis: 1.0.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
+ is-callable: 1.2.7
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.3
+ is-string: 1.0.7
+ is-typed-array: 1.1.13
+ is-weakref: 1.0.2
+ object-inspect: 1.13.2
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.15
+ dev: true
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ /es-iterator-helpers@1.0.19:
+ resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.0.3
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.4
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ internal-slot: 1.0.7
+ iterator.prototype: 1.1.2
+ safe-array-concat: 1.1.2
+ dev: true
+
+ /es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: true
+
+ /es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: true
+
+ /esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+
+ /escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ engines: {node: '>=6'}
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ /escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.28.1)(eslint@8.51.0):
+ resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ peerDependencies:
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.2
+ dependencies:
+ confusing-browser-globals: 1.0.11
+ eslint: 8.51.0
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)
+ object.assign: 4.1.5
+ object.entries: 1.1.8
+ semver: 6.3.1
+ dev: true
+
+ /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.51.0):
+ resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0
+ '@typescript-eslint/parser': ^5.0.0 || ^6.0.0
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.3
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ eslint: 8.51.0
+ eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.28.1)(eslint@8.51.0)
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)
+ dev: true
+
+ /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.28.1)(eslint-plugin-jsx-a11y@6.7.1)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.33.2)(eslint@8.51.0):
+ resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==}
+ engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.3
+ eslint-plugin-jsx-a11y: ^6.5.1
+ eslint-plugin-react: ^7.28.0
+ eslint-plugin-react-hooks: ^4.3.0
+ dependencies:
+ eslint: 8.51.0
+ eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.28.1)(eslint@8.51.0)
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)
+ eslint-plugin-jsx-a11y: 6.7.1(eslint@8.51.0)
+ eslint-plugin-react: 7.33.2(eslint@8.51.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.51.0)
+ object.assign: 4.1.5
+ object.entries: 1.1.8
+ dev: true
+
+ /eslint-config-prettier@8.10.0(eslint@8.51.0):
+ resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.51.0
+ dev: true
+
+ /eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.28.1):
+ resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==}
+ engines: {node: '>= 4'}
+ peerDependencies:
+ eslint-plugin-import: '>=1.4.0'
+ dependencies:
+ eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)
+ dev: true
+
+ /eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.15.0
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0):
+ resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ debug: 3.2.7
+ eslint: 8.51.0
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0):
+ resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@5.2.2)
+ 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: 8.51.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0)
+ has: 1.0.4
+ is-core-module: 2.15.0
+ 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
+ tsconfig-paths: 3.15.0
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jsx-a11y@6.7.1(eslint@8.51.0):
+ resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ '@babel/runtime': 7.25.0
+ aria-query: 5.3.0
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.7
+ axe-core: 4.10.0
+ axobject-query: 3.2.4
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 8.51.0
+ has: 1.0.4
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.5
+ minimatch: 3.1.2
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ semver: 6.3.1
+ dev: true
+
+ /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.51.0)(prettier@2.8.8):
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+ dependencies:
+ eslint: 8.51.0
+ eslint-config-prettier: 8.10.0(eslint@8.51.0)
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ dev: true
+
+ /eslint-plugin-react-hooks@4.6.0(eslint@8.51.0):
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ dependencies:
+ eslint: 8.51.0
+ dev: true
+
+ /eslint-plugin-react@7.33.2(eslint@8.51.0):
+ resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flatmap: 1.3.2
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.0.19
+ eslint: 8.51.0
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.8
+ object.fromentries: 2.0.8
+ object.hasown: 1.1.4
+ object.values: 1.2.0
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.11
+ dev: true
+
+ /eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.51.0):
+ resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.0.0
+ eslint: ^8.0.0
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@5.2.2)
+ eslint: 8.51.0
+ eslint-rule-composer: 0.3.0
+ dev: true
+
+ /eslint-rule-composer@0.3.0:
+ resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint@8.51.0:
+ resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0)
+ '@eslint-community/regexpp': 4.11.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.51.0
+ '@humanwhocodes/config-array': 0.11.14
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.6
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.12.1
+ acorn-jsx: 5.3.2(acorn@8.12.1)
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ /etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /eventemitter3@2.0.3:
+ resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
+ dev: false
+
+ /eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ dev: true
+
+ /execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+ dev: true
+
+ /execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /execall@1.0.0:
+ resolution: {integrity: sha512-/J0Q8CvOvlAdpvhfkD/WnTQ4H1eU0exze2nFGPj/RSC7jpQ0NkKe2r28T5eMkhEEs+fzepMZNy1kVRKNlC04nQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ clone-regexp: 1.0.1
+ dev: true
+
+ /expand-brackets@2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: true
+
+ /extend-shallow@3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+ dev: true
+
+ /extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ /extglob@2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ /fast-diff@1.1.2:
+ resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
+ dev: false
+
+ /fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+ dev: true
+
+ /fast-glob@2.2.7:
+ resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ '@mrmlnc/readdir-enhanced': 2.2.1
+ '@nodelib/fs.stat': 1.1.3
+ glob-parent: 3.1.0
+ is-glob: 4.0.3
+ merge2: 1.4.1
+ micromatch: 3.1.10
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.7
+ dev: true
+
+ /fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fast-shallow-equal@1.0.0:
+ resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
+ dev: false
+
+ /fast-uri@3.0.1:
+ resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==}
+ dev: true
+
+ /fast-xml-parser@4.4.1:
+ resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==}
+ hasBin: true
+ dependencies:
+ strnum: 1.0.5
+ dev: false
+
+ /fastest-levenshtein@1.0.16:
+ resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+ engines: {node: '>= 4.9.1'}
+ dev: true
+
+ /fastest-stable-stringify@2.0.2:
+ resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==}
+ dev: false
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fault@2.0.1:
+ resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
+ dependencies:
+ format: 0.2.2
+ dev: false
+
+ /file-entry-cache@4.0.0:
+ resolution: {integrity: sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==}
+ engines: {node: '>=4'}
+ dependencies:
+ flat-cache: 2.0.1
+ dev: true
+
+ /file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.2.0
+ dev: true
+
+ /fill-range@4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+ dev: true
+
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
+ /find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+ dev: false
+
+ /find-up@2.1.0:
+ resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ locate-path: 2.0.0
+ dev: true
+
+ /find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache@2.0.1:
+ resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==}
+ engines: {node: '>=4'}
+ dependencies:
+ flatted: 2.0.2
+ rimraf: 2.6.3
+ write: 1.0.3
+ dev: true
+
+ /flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.3.1
+ keyv: 4.5.4
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted@2.0.2:
+ resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==}
+ dev: true
+
+ /flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ dev: true
+
+ /follow-redirects@1.15.6:
+ resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ dev: false
+
+ /for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ dependencies:
+ is-callable: 1.2.7
+ dev: true
+
+ /for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+ dev: true
+
+ /form-data@4.0.0:
+ resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+ dev: false
+
+ /format@0.2.2:
+ resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+ engines: {node: '>=0.4.x'}
+ dev: false
+
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ dev: true
+
+ /fragment-cache@0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ map-cache: 0.2.2
+ dev: true
+
+ /framer-motion@10.16.4(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.6.3
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ dev: false
+
+ /fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: true
+
+ /fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: true
+
+ /fs-readdir-recursive@1.1.0:
+ resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==}
+ dev: false
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ /function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ functions-have-names: 1.2.3
+ dev: true
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ /get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+
+ /get-stdin@6.0.0:
+ resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /git-raw-commits@2.0.11:
+ resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ dargs: 7.0.0
+ lodash: 4.17.21
+ meow: 8.1.2
+ split2: 3.2.2
+ through2: 4.0.2
+ dev: true
+
+ /glob-parent@3.1.0:
+ resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==}
+ dependencies:
+ is-glob: 3.1.0
+ path-dirname: 1.0.2
+ dev: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-to-regexp@0.3.0:
+ resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==}
+ dev: true
+
+ /glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.0
+ path-scurry: 1.11.1
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ /global-dirs@0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+ dependencies:
+ ini: 1.3.8
+ dev: true
+
+ /global-modules@2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+ dependencies:
+ global-prefix: 3.0.0
+ dev: true
+
+ /global-prefix@3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.1
+ dev: true
+
+ /globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ /globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.0.1
+ dev: true
+
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /globby@9.2.0:
+ resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@types/glob': 7.2.0
+ array-union: 1.0.2
+ dir-glob: 2.2.2
+ fast-glob: 2.2.7
+ glob: 7.2.3
+ ignore: 4.0.6
+ pify: 4.0.1
+ slash: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /globjoin@0.1.4:
+ resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+ dev: true
+
+ /globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+ dev: true
+
+ /gonzales-pe@4.3.0:
+ resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==}
+ engines: {node: '>=0.6.0'}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.4
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
+ /graphql@16.9.0:
+ resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ dev: true
+
+ /hard-rejection@2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /has-ansi@2.0.0:
+ resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag@1.0.0:
+ resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ dependencies:
+ es-define-property: 1.0.0
+
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+
+ /has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+ dev: true
+
+ /has-value@1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+ dev: true
+
+ /has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /has-values@1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+ dev: true
+
+ /has@1.0.4:
+ resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
+ engines: {node: '>= 0.4.0'}
+ dev: true
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+
+ /hast-util-from-parse5@7.1.2:
+ resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ hastscript: 7.2.0
+ property-information: 6.5.0
+ vfile: 5.3.7
+ vfile-location: 4.1.0
+ web-namespaces: 2.0.1
+ dev: false
+
+ /hast-util-is-element@2.1.3:
+ resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ dev: false
+
+ /hast-util-parse-selector@3.1.1:
+ resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
+ dependencies:
+ '@types/hast': 2.3.10
+ dev: false
+
+ /hast-util-raw@7.2.3:
+ resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/parse5': 6.0.3
+ hast-util-from-parse5: 7.1.2
+ hast-util-to-parse5: 7.1.0
+ html-void-elements: 2.0.1
+ parse5: 6.0.1
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+ vfile: 5.3.7
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
+ /hast-util-to-parse5@7.1.0:
+ resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 2.0.3
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
+ /hast-util-to-text@3.1.2:
+ resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/unist': 2.0.11
+ hast-util-is-element: 2.1.3
+ unist-util-find-after: 4.0.1
+ dev: false
+
+ /hast-util-whitespace@2.0.1:
+ resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+ dev: false
+
+ /hastscript@7.2.0:
+ resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 3.1.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ dev: false
+
+ /he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+ dev: true
+
+ /headers-polyfill@4.0.3:
+ resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
+ dev: true
+
+ /highlight.js@11.8.0:
+ resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==}
+ engines: {node: '>=12.0.0'}
+ dev: false
+
+ /highlight.js@11.9.0:
+ resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
+ engines: {node: '>=12.0.0'}
+ dev: false
+
+ /hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ dependencies:
+ react-is: 16.13.1
+
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /hosted-git-info@4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /html-parse-stringify@3.0.1:
+ resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
+ dependencies:
+ void-elements: 3.1.0
+ dev: false
+
+ /html-tags@2.0.0:
+ resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /html-void-elements@2.0.1:
+ resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+ dev: false
+
+ /htmlparser2@3.10.1:
+ resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+ dependencies:
+ domelementtype: 1.3.1
+ domhandler: 2.4.2
+ domutils: 1.7.0
+ entities: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+ dev: true
+
+ /husky@8.0.3:
+ resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /hyphenate-style-name@1.1.0:
+ resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==}
+ dev: false
+
+ /i18next-browser-languagedetector@7.1.0:
+ resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /i18next@23.5.1:
+ resolution: {integrity: sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg==}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /ignore@4.0.6:
+ resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /image-size@0.5.5:
+ resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+ dev: true
+
+ /immutable@4.3.7:
+ resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==}
+
+ /import-fresh@2.0.0:
+ resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==}
+ engines: {node: '>=4'}
+ dependencies:
+ caller-path: 2.0.0
+ resolve-from: 3.0.0
+ dev: true
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ /import-lazy@3.1.0:
+ resolution: {integrity: sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string@3.2.0:
+ resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /indent-string@5.0.0:
+ resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /indexes-of@1.0.1:
+ resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==}
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: true
+
+ /inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+ dev: false
+
+ /inline-style-prefixer@7.0.1:
+ resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==}
+ dependencies:
+ css-in-js-utils: 3.1.0
+ dev: false
+
+ /internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
+ dev: true
+
+ /invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /is-accessor-descriptor@1.0.1:
+ resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /is-alphabetical@1.0.4:
+ resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+ dev: true
+
+ /is-alphanumeric@1.0.0:
+ resolution: {integrity: sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-alphanumerical@1.0.4:
+ resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+ dependencies:
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+ dev: true
+
+ /is-arguments@1.1.1:
+ resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ /is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+ dev: false
+
+ /is-async-function@2.0.0:
+ resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.3.0
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+ dev: true
+
+ /is-buffer@2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+ engines: {node: '>=4'}
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module@2.15.0:
+ resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+
+ /is-data-descriptor@1.0.1:
+ resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-typed-array: 1.1.13
+ dev: true
+
+ /is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+
+ /is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+ dev: true
+
+ /is-descriptor@0.1.7:
+ resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+ dev: true
+
+ /is-descriptor@1.0.3:
+ resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+ dev: true
+
+ /is-directory@0.3.1:
+ resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dev: true
+
+ /is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-plain-object: 2.0.4
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ /is-finalizationregistry@1.0.2:
+ resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-fullwidth-code-point@2.0.0:
+ resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-generator-function@1.0.10:
+ resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-glob@3.1.0:
+ resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+
+ /is-hexadecimal@1.0.4:
+ resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+ dev: true
+
+ /is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-node-process@1.2.0:
+ resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+ dev: true
+
+ /is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-number@3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ /is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj@1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+
+ /is-regexp@1.0.0:
+ resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-supported-regexp-flag@1.0.1:
+ resolution: {integrity: sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-text-path@1.0.1:
+ resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ text-extensions: 1.9.0
+ dev: true
+
+ /is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.15
+ dev: true
+
+ /is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-weakset@2.0.3:
+ resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /is-whitespace-character@1.0.4:
+ resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==}
+ dev: true
+
+ /is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-word-character@1.0.4:
+ resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==}
+ dev: true
+
+ /is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+ dev: true
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+ dev: true
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isarray: 1.0.0
+ dev: true
+
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /iterator.prototype@1.1.2:
+ resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
+ dependencies:
+ define-properties: 1.2.1
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ reflect.getprototypeof: 1.0.6
+ set-function-name: 2.0.2
+ dev: true
+
+ /jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+ dev: true
+
+ /jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+ dev: true
+
+ /js-base64@2.6.4:
+ resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+ dev: true
+
+ /js-cookie@2.2.1:
+ resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
+ dev: false
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ /js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsesc@0.5.0:
+ resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+ hasBin: true
+ dev: false
+
+ /jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-parse-better-errors@1.0.2:
+ resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==}
+ dev: true
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json2mq@0.2.0:
+ resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+ dependencies:
+ string-convert: 0.2.1
+ dev: false
+
+ /json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: true
+
+ /jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+ dev: true
+
+ /jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.2.0
+ dev: true
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of@4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-buffer: 1.1.6
+ dev: true
+
+ /kind-of@5.1.0:
+ resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /known-css-properties@0.11.0:
+ resolution: {integrity: sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==}
+ dev: true
+
+ /known-css-properties@0.28.0:
+ resolution: {integrity: sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==}
+ dev: true
+
+ /language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+ dev: true
+
+ /language-tags@1.0.5:
+ resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ dependencies:
+ language-subtag-registry: 0.3.23
+ dev: true
+
+ /leven@2.1.0:
+ resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ /lint-staged@13.3.0:
+ resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ chalk: 5.3.0
+ commander: 11.0.0
+ debug: 4.3.4
+ execa: 7.2.0
+ lilconfig: 2.1.0
+ listr2: 6.6.1
+ micromatch: 4.0.5
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.3.1
+ transitivePeerDependencies:
+ - enquirer
+ - supports-color
+ dev: true
+
+ /listr2@6.6.1:
+ resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ enquirer: '>= 2.3.0 < 3'
+ peerDependenciesMeta:
+ enquirer:
+ optional: true
+ dependencies:
+ cli-truncate: 3.1.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 5.0.1
+ rfdc: 1.4.1
+ wrap-ansi: 8.1.0
+ dev: true
+
+ /load-json-file@4.0.0:
+ resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==}
+ engines: {node: '>=4'}
+ dependencies:
+ graceful-fs: 4.2.11
+ parse-json: 4.0.0
+ pify: 3.0.0
+ strip-bom: 3.0.0
+ dev: true
+
+ /loader-utils@1.4.2:
+ resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.2
+ dev: true
+
+ /locate-path@2.0.0:
+ resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-locate: 2.0.0
+ path-exists: 3.0.0
+ dev: true
+
+ /locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: true
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ dev: false
+
+ /lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: true
+
+ /lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+ dev: false
+
+ /lodash.isfunction@3.0.9:
+ resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
+ dev: true
+
+ /lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+ dev: true
+
+ /lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+ dev: true
+
+ /lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+ dev: true
+
+ /lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+ dev: true
+
+ /lodash.truncate@4.4.2:
+ resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+ dev: true
+
+ /lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ dev: true
+
+ /lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols@2.2.0:
+ resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==}
+ engines: {node: '>=4'}
+ dependencies:
+ chalk: 2.4.2
+ dev: true
+
+ /log-update@5.0.1:
+ resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ ansi-escapes: 5.0.0
+ cli-cursor: 4.0.0
+ slice-ansi: 5.0.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 8.1.0
+ dev: true
+
+ /longest-streak@2.0.4:
+ resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==}
+ dev: true
+
+ /longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+ dev: false
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+
+ /loud-rejection@1.6.0:
+ resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ currently-unhandled: 0.4.1
+ signal-exit: 3.0.7
+ dev: true
+
+ /lowlight@2.9.0:
+ resolution: {integrity: sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ fault: 2.0.1
+ highlight.js: 11.8.0
+ dev: false
+
+ /lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+ dev: true
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+
+ /lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /make-dir@2.1.0:
+ resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+ engines: {node: '>=6'}
+ dependencies:
+ pify: 4.0.1
+ semver: 5.7.2
+ dev: false
+
+ /make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+ dev: true
+
+ /map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj@1.0.1:
+ resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj@2.0.0:
+ resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /map-obj@4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /map-visit@1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ object-visit: 1.0.1
+ dev: true
+
+ /markdown-escapes@1.0.4:
+ resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==}
+ dev: true
+
+ /markdown-table@1.1.3:
+ resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==}
+ dev: true
+
+ /markdown-table@3.0.3:
+ resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+ dev: false
+
+ /mathml-tag-names@2.1.3:
+ resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+ dev: true
+
+ /mdast-util-compact@1.0.4:
+ resolution: {integrity: sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==}
+ dependencies:
+ unist-util-visit: 1.4.1
+ dev: true
+
+ /mdast-util-definitions@5.1.2:
+ resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ unist-util-visit: 4.1.2
+ dev: false
+
+ /mdast-util-find-and-replace@2.2.2:
+ resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ escape-string-regexp: 5.0.0
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+ dev: false
+
+ /mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ decode-named-character-reference: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ unist-util-stringify-position: 3.0.3
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-autolink-literal@1.0.3:
+ resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ ccount: 2.0.1
+ mdast-util-find-and-replace: 2.2.2
+ micromark-util-character: 1.2.0
+ dev: false
+
+ /mdast-util-gfm-footnote@1.0.2:
+ resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+ micromark-util-normalize-identifier: 1.1.0
+ dev: false
+
+ /mdast-util-gfm-strikethrough@1.0.3:
+ resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+ dev: false
+
+ /mdast-util-gfm-table@1.0.7:
+ resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ markdown-table: 3.0.3
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-task-list-item@1.0.2:
+ resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-to-markdown: 1.5.0
+ dev: false
+
+ /mdast-util-gfm@2.0.2:
+ resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==}
+ dependencies:
+ mdast-util-from-markdown: 1.3.1
+ mdast-util-gfm-autolink-literal: 1.0.3
+ mdast-util-gfm-footnote: 1.0.2
+ mdast-util-gfm-strikethrough: 1.0.3
+ mdast-util-gfm-table: 1.0.7
+ mdast-util-gfm-task-list-item: 1.0.2
+ mdast-util-to-markdown: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ unist-util-is: 5.2.1
+ dev: false
+
+ /mdast-util-to-hast@12.3.0:
+ resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-definitions: 5.1.2
+ micromark-util-sanitize-uri: 1.2.0
+ trim-lines: 3.0.1
+ unist-util-generated: 2.0.1
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+ dev: false
+
+ /mdast-util-to-markdown@1.5.0:
+ resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 3.0.1
+ mdast-util-to-string: 3.2.0
+ micromark-util-decode-string: 1.1.0
+ unist-util-visit: 4.1.2
+ zwitch: 2.0.4
+ dev: false
+
+ /mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ dev: false
+
+ /mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: true
+
+ /memoize-one@5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+ dev: false
+
+ /meow@10.1.5:
+ resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ '@types/minimist': 1.2.5
+ camelcase-keys: 7.0.2
+ decamelize: 5.0.1
+ decamelize-keys: 1.1.1
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 8.0.0
+ redent: 4.0.0
+ trim-newlines: 4.1.1
+ type-fest: 1.4.0
+ yargs-parser: 20.2.9
+ dev: true
+
+ /meow@5.0.0:
+ resolution: {integrity: sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==}
+ engines: {node: '>=6'}
+ dependencies:
+ camelcase-keys: 4.2.0
+ decamelize-keys: 1.1.1
+ loud-rejection: 1.6.0
+ minimist-options: 3.0.2
+ normalize-package-data: 2.5.0
+ read-pkg-up: 3.0.0
+ redent: 2.0.0
+ trim-newlines: 2.0.0
+ yargs-parser: 10.1.0
+ dev: true
+
+ /meow@8.1.2:
+ resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/minimist': 1.2.5
+ camelcase-keys: 6.2.2
+ decamelize-keys: 1.1.1
+ hard-rejection: 2.1.0
+ minimist-options: 4.1.0
+ normalize-package-data: 3.0.3
+ read-pkg-up: 7.0.1
+ redent: 3.0.0
+ trim-newlines: 3.0.1
+ type-fest: 0.18.1
+ yargs-parser: 20.2.9
+ dev: true
+
+ /merge-options@1.0.1:
+ resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
+ engines: {node: '>=4'}
+ dependencies:
+ is-plain-obj: 1.1.0
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-extension-gfm-autolink-literal@1.0.5:
+ resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-extension-gfm-footnote@1.1.2:
+ resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==}
+ dependencies:
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-extension-gfm-strikethrough@1.0.7:
+ resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-extension-gfm-table@1.0.7:
+ resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-extension-gfm-tagfilter@1.0.2:
+ resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==}
+ dependencies:
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-extension-gfm-task-list-item@1.0.5:
+ resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-extension-gfm@2.0.3:
+ resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==}
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 1.0.5
+ micromark-extension-gfm-footnote: 1.1.2
+ micromark-extension-gfm-strikethrough: 1.0.7
+ micromark-extension-gfm-table: 1.0.7
+ micromark-extension-gfm-tagfilter: 1.0.2
+ micromark-extension-gfm-task-list-item: 1.0.5
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+ dev: false
+
+ /micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+ dev: false
+
+ /micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+ dependencies:
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+ dev: false
+
+ /micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+ dev: false
+
+ /micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.6
+ decode-named-character-reference: 1.0.2
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /micromatch@3.1.0:
+ resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 1.0.0
+ extend-shallow: 2.0.1
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 5.1.0
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /micromatch@3.1.10:
+ resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 6.0.3
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: true
+
+ /micromatch@4.0.7:
+ resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: true
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+ dev: false
+
+ /mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+
+ /minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist-options@3.0.2:
+ resolution: {integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==}
+ engines: {node: '>= 4'}
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ dev: true
+
+ /minimist-options@4.1.0:
+ resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+ engines: {node: '>= 6'}
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ kind-of: 6.0.3
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dev: true
+
+ /mixin-deep@1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+ dev: true
+
+ /mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ dev: true
+
+ /msw@2.2.14(typescript@5.2.2):
+ resolution: {integrity: sha512-64i8rNCa1xzDK8ZYsTrVMli05D687jty8+Th+PU5VTbJ2/4P7fkQFVyDQ6ZFT5FrNR8z2BHhbY47fKNvfHrumA==}
+ engines: {node: '>=18'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ typescript: '>= 4.7.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@bundled-es-modules/cookie': 2.0.0
+ '@bundled-es-modules/statuses': 1.0.1
+ '@inquirer/confirm': 3.1.22
+ '@mswjs/cookies': 1.1.1
+ '@mswjs/interceptors': 0.26.15
+ '@open-draft/until': 2.1.0
+ '@types/cookie': 0.6.0
+ '@types/statuses': 2.0.5
+ chalk: 4.1.2
+ graphql: 16.9.0
+ headers-polyfill: 4.0.3
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ path-to-regexp: 6.2.2
+ strict-event-emitter: 0.5.1
+ type-fest: 4.25.0
+ typescript: 5.2.2
+ yargs: 17.7.2
+ dev: true
+
+ /mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: true
+
+ /mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+ dev: true
+
+ /nano-css@5.6.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ css-tree: 1.1.3
+ csstype: 3.1.3
+ fastest-stable-stringify: 2.0.2
+ inline-style-prefixer: 7.0.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ rtl-css-js: 1.16.1
+ stacktrace-js: 2.0.2
+ stylis: 4.3.2
+ dev: false
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /nanomatch@1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+ dev: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+ /normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.8
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-package-data@3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.15.0
+ semver: 7.6.3
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ /normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /normalize-selector@0.2.0:
+ resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==}
+ dev: true
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+ dev: false
+
+ /nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ dependencies:
+ boolbase: 1.0.0
+ dev: true
+
+ /num2fraction@1.2.2:
+ resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==}
+ dev: true
+
+ /numeral@2.0.6:
+ resolution: {integrity: sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==}
+ dev: false
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ /object-copy@0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+ dev: true
+
+ /object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
+
+ /object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ dev: false
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ /object-visit@1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ dev: true
+
+ /object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+ dev: true
+
+ /object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+
+ /onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+ dev: true
+
+ /onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: true
+
+ /optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+ dev: true
+
+ /outvariant@1.4.3:
+ resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+ dev: true
+
+ /p-limit@1.3.0:
+ resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-try: 1.0.0
+ dev: true
+
+ /p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+ dev: true
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate@2.0.0:
+ resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==}
+ engines: {node: '>=4'}
+ dependencies:
+ p-limit: 1.3.0
+ dev: true
+
+ /p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-try@1.0.0:
+ resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /package-json-from-dist@1.0.0:
+ resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+ dev: true
+
+ /parchment@1.1.4:
+ resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
+ dev: false
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+
+ /parse-entities@1.2.2:
+ resolution: {integrity: sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==}
+ dependencies:
+ character-entities: 1.2.4
+ character-entities-legacy: 1.1.4
+ character-reference-invalid: 1.1.4
+ is-alphanumerical: 1.0.4
+ is-decimal: 1.0.4
+ is-hexadecimal: 1.0.4
+ dev: true
+
+ /parse-json@4.0.0:
+ resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
+ engines: {node: '>=4'}
+ dependencies:
+ error-ex: 1.3.2
+ json-parse-better-errors: 1.0.2
+ dev: true
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.24.7
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ /parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+ dev: false
+
+ /pascalcase@0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-dirname@1.0.2:
+ resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==}
+ dev: true
+
+ /path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ /path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+ dev: true
+
+ /path-to-regexp@6.2.2:
+ resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==}
+ dev: true
+
+ /path-type@3.0.0:
+ resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
+ engines: {node: '>=4'}
+ dependencies:
+ pify: 3.0.0
+ dev: true
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ /pathe@0.2.0:
+ resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+ dev: true
+
+ /picocolors@0.2.1:
+ resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==}
+ dev: true
+
+ /picocolors@1.0.1:
+ resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ /pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+ dev: true
+
+ /pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /pify@3.0.0:
+ resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ /pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /posix-character-classes@0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /postcss-html@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39):
+ resolution: {integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==}
+ peerDependencies:
+ postcss: '>=5.0.0'
+ postcss-syntax: '>=0.36.0'
+ dependencies:
+ htmlparser2: 3.10.1
+ postcss: 7.0.39
+ postcss-syntax: 0.36.2(postcss@8.4.31)
+ dev: true
+
+ /postcss-import@15.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+ dev: true
+
+ /postcss-js@4.0.1(postcss@8.4.31):
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.31
+ dev: true
+
+ /postcss-jsx@0.36.4(postcss-syntax@0.36.2)(postcss@7.0.39):
+ resolution: {integrity: sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA==}
+ peerDependencies:
+ postcss: '>=5.0.0'
+ postcss-syntax: '>=0.36.0'
+ dependencies:
+ '@babel/core': 7.25.2
+ postcss: 7.0.39
+ postcss-syntax: 0.36.2(postcss@8.4.31)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /postcss-less@3.1.4:
+ resolution: {integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==}
+ engines: {node: '>=6.14.4'}
+ dependencies:
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-load-config@4.0.2(postcss@8.4.31)(ts-node@10.9.1):
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 3.1.2
+ postcss: 8.4.31
+ ts-node: 10.9.1(@types/node@22.4.1)(typescript@5.2.2)
+ yaml: 2.5.0
+ dev: true
+
+ /postcss-markdown@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39):
+ resolution: {integrity: sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==}
+ peerDependencies:
+ postcss: '>=5.0.0'
+ postcss-syntax: '>=0.36.0'
+ dependencies:
+ postcss: 7.0.39
+ postcss-syntax: 0.36.2(postcss@8.4.31)
+ remark: 10.0.1
+ unist-util-find-all-after: 1.0.5
+ dev: true
+
+ /postcss-media-query-parser@0.2.3:
+ resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+ dev: true
+
+ /postcss-nested@6.2.0(postcss@8.4.31):
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: true
+
+ /postcss-nesting@11.3.0(postcss@8.4.31):
+ resolution: {integrity: sha512-JlS10AQm/RzyrUGgl5irVkAlZYTJ99mNueUl+Qab+TcHhVedLiylWVkKBhRale+rS9yWIJK48JVzQlq3LcSdeA==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss: ^8.4
+ dependencies:
+ '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2)
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: true
+
+ /postcss-prefix-selector@1.16.1(postcss@5.2.18):
+ resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+ peerDependencies:
+ postcss: '>4 <9'
+ dependencies:
+ postcss: 5.2.18
+ dev: true
+
+ /postcss-reporter@6.0.1:
+ resolution: {integrity: sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==}
+ engines: {node: '>=6'}
+ dependencies:
+ chalk: 2.4.2
+ lodash: 4.17.21
+ log-symbols: 2.2.0
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-resolve-nested-selector@0.1.6:
+ resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+ dev: true
+
+ /postcss-safe-parser@4.0.2:
+ resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-safe-parser@6.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.3.3
+ dependencies:
+ postcss: 8.4.31
+ dev: true
+
+ /postcss-sass@0.3.5:
+ resolution: {integrity: sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==}
+ dependencies:
+ gonzales-pe: 4.3.0
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-scss@2.1.1:
+ resolution: {integrity: sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-selector-parser@3.1.2:
+ resolution: {integrity: sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==}
+ engines: {node: '>=8'}
+ dependencies:
+ dot-prop: 5.3.0
+ indexes-of: 1.0.1
+ uniq: 1.0.1
+ dev: true
+
+ /postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /postcss-sorting@4.1.0:
+ resolution: {integrity: sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw==}
+ engines: {node: '>=6.14.3'}
+ dependencies:
+ lodash: 4.17.21
+ postcss: 7.0.39
+ dev: true
+
+ /postcss-sorting@8.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==}
+ peerDependencies:
+ postcss: ^8.4.20
+ dependencies:
+ postcss: 8.4.31
+ dev: true
+
+ /postcss-syntax@0.36.2(postcss@8.4.31):
+ resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==}
+ peerDependencies:
+ postcss: '>=5.0.0'
+ postcss-html: '*'
+ postcss-jsx: '*'
+ postcss-less: '*'
+ postcss-markdown: '*'
+ postcss-scss: '*'
+ peerDependenciesMeta:
+ postcss-html:
+ optional: true
+ postcss-jsx:
+ optional: true
+ postcss-less:
+ optional: true
+ postcss-markdown:
+ optional: true
+ postcss-scss:
+ optional: true
+ dependencies:
+ postcss: 8.4.31
+ dev: true
+
+ /postcss-value-parser@3.3.1:
+ resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==}
+ dev: true
+
+ /postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ /postcss@5.2.18:
+ resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ chalk: 1.1.3
+ js-base64: 2.6.4
+ source-map: 0.5.7
+ supports-color: 3.2.3
+ dev: true
+
+ /postcss@7.0.39:
+ resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ picocolors: 0.2.1
+ source-map: 0.6.1
+ dev: true
+
+ /postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.1
+ source-map-js: 1.2.0
+
+ /posthtml-parser@0.2.1:
+ resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
+ dependencies:
+ htmlparser2: 3.10.1
+ isobject: 2.1.0
+ dev: true
+
+ /posthtml-rename-id@1.0.12:
+ resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /posthtml-render@1.4.0:
+ resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /posthtml-svg-mode@1.0.3:
+ resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
+ dependencies:
+ merge-options: 1.0.1
+ posthtml: 0.9.2
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+ dev: true
+
+ /posthtml@0.9.2:
+ resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ posthtml-parser: 0.2.1
+ posthtml-render: 1.4.0
+ dev: true
+
+ /preact@10.12.1:
+ resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==}
+ dev: false
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ fast-diff: 1.3.0
+ dev: true
+
+ /prettier-plugin-tailwindcss@0.3.0(prettier@2.8.8):
+ resolution: {integrity: sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==}
+ engines: {node: '>=12.17.0'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@shufo/prettier-plugin-blade': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ prettier: '>=2.2.0'
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-import-sort: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-style-order: '*'
+ prettier-plugin-svelte: '*'
+ prettier-plugin-twig-melody: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@shufo/prettier-plugin-blade':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-import-sort:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-style-order:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
+ prettier-plugin-twig-melody:
+ optional: true
+ dependencies:
+ prettier: 2.8.8
+ dev: true
+
+ /prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ /property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+ dev: false
+
+ /proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ dev: false
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.6
+ dev: false
+
+ /query-string@4.3.4:
+ resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ object-assign: 4.1.1
+ strict-uri-encode: 1.1.0
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /quick-lru@1.1.0:
+ resolution: {integrity: sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /quick-lru@4.0.1:
+ resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /quick-lru@5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /quill-delta@3.6.3:
+ resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ deep-equal: 1.1.2
+ extend: 3.0.2
+ fast-diff: 1.1.2
+ dev: false
+
+ /quill@1.3.7:
+ resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
+ dependencies:
+ clone: 2.1.2
+ deep-equal: 1.1.2
+ eventemitter3: 2.0.3
+ extend: 3.0.2
+ parchment: 1.1.4
+ quill-delta: 3.6.3
+ dev: false
+
+ /raf-schd@4.0.3:
+ resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==}
+ dev: false
+
+ /ramda@0.29.1:
+ resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==}
+ dev: false
+
+ /rc-cascader@3.27.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ array-tree-filter: 2.1.0
+ classnames: 2.3.2
+ rc-select: 14.15.1(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.8.8(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-checkbox@3.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-collapse@3.7.3(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-dialog@9.5.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-drawer@7.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-dropdown@4.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-field-form@2.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-QyiYrE3uweGGi21MJpxHFmDW+Tb1yt5hitM1k0EbWc5hKDiSf5imOBc6NLLHrYk+sdelrw2Ju/fD4uRQdhSqNg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/async-validator': 5.0.4
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-image@7.9.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-dialog: 9.5.2(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-input-number@9.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-5XZFhBCV5f9UQ62AZ2hFbEY8iZT/dm23Q1kAg0H8EvOgD3UDbYYJAayoVIkM3lQaCqYAW5gV0yV3vjw1XtzWHg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/mini-decimal': 1.1.0
+ classnames: 2.3.2
+ rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-input@1.6.3(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-mentions@2.15.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0)
+ rc-textarea: 1.8.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-menu@9.14.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-motion@2.9.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-notification@5.6.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-overflow@1.3.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-pagination@4.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-picker@4.6.13(dayjs@1.11.12)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-yi4JWPGjm420Q8rHjZ6YNy2c5IfV+9EAzx2pewVRPOjJqfg7uifO/Z0uqxdl/h6AhBocuvRvtlyz6ehrAvTq7A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ date-fns: '>= 2.x'
+ dayjs: '>= 1.x'
+ luxon: '>= 3.x'
+ moment: '>= 2.x'
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ peerDependenciesMeta:
+ date-fns:
+ optional: true
+ dayjs:
+ optional: true
+ luxon:
+ optional: true
+ moment:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ dayjs: 1.11.12
+ rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-progress@4.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-rate@2.13.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-resize-observer@1.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ resize-observer-polyfill: 1.5.1
+ dev: false
+
+ /rc-segmented@2.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-select@14.15.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-mGvuwW1RMm1NCSI8ZUoRoLRK51R2Nb+QJnmiAvbDRcjh2//ulCkxeV6ZRFTECPpE1t2DPfyqZMPw90SVJzQ7wQ==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.14.5(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-slider@11.1.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-b77H5PbjMKsvkYXAYIkn50QuFX6ICQmCTibDinI9q+BHx65/TV4TeU25+oadhSRzykxs0/vBWeKBwRyySOeWlg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-steps@6.0.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-switch@4.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-table@7.45.7(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/context': 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.14.5(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-tabs@15.1.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-dropdown: 4.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-textarea@1.8.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-bm36N2ZqwZAP60ZQg2OY9mPdqWC+m6UTjHc+CqEZOxb3Ia29BGHazY/s5bI8M4113CkqTzhtFUDNA078ZiOx3Q==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-tooltip@6.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@rc-component/trigger': 2.2.1(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-tree-select@5.22.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-select: 14.15.1(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.8.8(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-tree@5.8.8(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==}
+ engines: {node: '>=10.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.14.5(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-upload@4.6.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Zr0DT1NHw/ApxrP7UAoxOtGaVYuzarrrCVr0ld7RiEFsKX07uFhE1EpCBxwL11ruFn89GMcshOKWp+s6FLyAlA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /rc-util@5.43.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-is: 18.3.1
+ dev: false
+
+ /rc-virtual-list@3.14.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ classnames: 2.3.2
+ rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /react-apexcharts@1.4.1(apexcharts@3.43.0)(react@18.2.0):
+ resolution: {integrity: sha512-G14nVaD64Bnbgy8tYxkjuXEUp/7h30Q0U33xc3AwtGFijJB9nHqOt1a6eG0WBn055RgRg+NwqbKGtqPxy15d0Q==}
+ peerDependencies:
+ apexcharts: ^3.41.0
+ react: '>=0.13'
+ dependencies:
+ apexcharts: 3.43.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: false
+
+ /react-beautiful-dnd@13.1.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==}
+ peerDependencies:
+ react: ^16.8.5 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.25.0
+ css-box-model: 1.2.1
+ memoize-one: 5.2.1
+ raf-schd: 4.0.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-redux: 7.2.9(react-dom@18.2.0)(react@18.2.0)
+ redux: 4.2.1
+ use-memo-one: 1.1.3(react@18.2.0)
+ transitivePeerDependencies:
+ - react-native
+ dev: false
+
+ /react-dom@18.2.0(react@18.2.0):
+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+ peerDependencies:
+ react: ^18.2.0
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.2.0
+ scheduler: 0.23.2
+ dev: false
+
+ /react-error-boundary@4.0.13(react@18.2.0):
+ resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==}
+ peerDependencies:
+ react: '>=16.13.1'
+ dependencies:
+ '@babel/runtime': 7.25.0
+ react: 18.2.0
+ dev: false
+
+ /react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+ dev: false
+
+ /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
+ peerDependencies:
+ react: ^16.6.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.25.0
+ invariant: 2.2.4
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-fast-compare: 3.2.2
+ shallowequal: 1.1.0
+ dev: false
+
+ /react-i18next@13.2.2(i18next@23.5.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ==}
+ peerDependencies:
+ i18next: '>= 23.2.3'
+ react: '>= 16.8.0'
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.25.0
+ html-parse-stringify: 3.0.1
+ i18next: 23.5.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /react-icons@4.11.0(react@18.2.0):
+ resolution: {integrity: sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==}
+ peerDependencies:
+ react: '*'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ /react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+ dev: false
+
+ /react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ dev: false
+
+ /react-markdown@8.0.7(@types/react@18.2.28)(react@18.2.0):
+ resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==}
+ peerDependencies:
+ '@types/react': '>=16'
+ react: '>=16'
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/prop-types': 15.7.12
+ '@types/react': 18.2.28
+ '@types/unist': 2.0.11
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 2.0.1
+ prop-types: 15.8.1
+ property-information: 6.5.0
+ react: 18.2.0
+ react-is: 18.3.1
+ remark-parse: 10.0.2
+ remark-rehype: 10.1.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.4
+ unified: 10.1.2
+ unist-util-visit: 4.1.2
+ vfile: 5.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /react-organizational-chart@2.2.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-JORmpLeYzCVtztdqCHsnKL8H3WiLRPHjohgh/PxQoszLuaQ+l3F8YefKSfpcBPZJhHwy3SlqjFjPC28a3Hh3QQ==}
+ engines: {node: '>=16', npm: '>=8'}
+ peerDependencies:
+ react: '>= 16.12.0'
+ react-dom: '>= 16.12.0'
+ dependencies:
+ '@emotion/css': 11.13.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /react-quill@2.0.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==}
+ peerDependencies:
+ react: ^16 || ^17 || ^18
+ react-dom: ^16 || ^17 || ^18
+ dependencies:
+ '@types/quill': 1.3.10
+ lodash: 4.17.21
+ quill: 1.3.7
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /react-redux@7.2.9(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==}
+ peerDependencies:
+ react: ^16.8.3 || ^17 || ^18
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.25.0
+ '@types/react-redux': 7.1.33
+ hoist-non-react-statics: 3.3.2
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-is: 17.0.2
+ dev: false
+
+ /react-refresh@0.14.2:
+ resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /react-router-dom@6.16.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
+ dependencies:
+ '@remix-run/router': 1.9.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-router: 6.16.0(react@18.2.0)
+ dev: false
+
+ /react-router@6.16.0(react@18.2.0):
+ resolution: {integrity: sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ react: '>=16.8'
+ dependencies:
+ '@remix-run/router': 1.9.0
+ react: 18.2.0
+ dev: false
+
+ /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.3):
+ resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
+ peerDependencies:
+ react: '*'
+ tslib: '*'
+ dependencies:
+ react: 18.2.0
+ tslib: 2.6.3
+ dev: false
+
+ /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@types/js-cookie': 2.2.7
+ '@xobotyi/scrollbar-width': 1.9.5
+ copy-to-clipboard: 3.3.3
+ fast-deep-equal: 3.1.3
+ fast-shallow-equal: 1.0.0
+ js-cookie: 2.2.1
+ nano-css: 5.6.2(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.3)
+ resize-observer-polyfill: 1.5.1
+ screenfull: 5.2.0
+ set-harmonic-interval: 1.0.1
+ throttle-debounce: 3.0.1
+ ts-easing: 0.2.0
+ tslib: 2.6.3
+ dev: false
+
+ /react@18.2.0:
+ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ dependencies:
+ pify: 2.3.0
+ dev: true
+
+ /read-pkg-up@3.0.0:
+ resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==}
+ engines: {node: '>=4'}
+ dependencies:
+ find-up: 2.1.0
+ read-pkg: 3.0.0
+ dev: true
+
+ /read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+ dev: true
+
+ /read-pkg-up@8.0.0:
+ resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ find-up: 5.0.0
+ read-pkg: 6.0.0
+ type-fest: 1.4.0
+ dev: true
+
+ /read-pkg@3.0.0:
+ resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==}
+ engines: {node: '>=4'}
+ dependencies:
+ load-json-file: 4.0.0
+ normalize-package-data: 2.5.0
+ path-type: 3.0.0
+ dev: true
+
+ /read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+ dev: true
+
+ /read-pkg@6.0.0:
+ resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 3.0.3
+ parse-json: 5.2.0
+ type-fest: 1.4.0
+ dev: true
+
+ /readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+
+ /redent@2.0.0:
+ resolution: {integrity: sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==}
+ engines: {node: '>=4'}
+ dependencies:
+ indent-string: 3.2.0
+ strip-indent: 2.0.0
+ dev: true
+
+ /redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+ dev: true
+
+ /redent@4.0.0:
+ resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
+ engines: {node: '>=12'}
+ dependencies:
+ indent-string: 5.0.0
+ strip-indent: 4.0.0
+ dev: true
+
+ /redux@4.2.1:
+ resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /reflect.getprototypeof@1.0.6:
+ resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ globalthis: 1.0.4
+ which-builtin-type: 1.1.4
+ dev: true
+
+ /regenerate-unicode-properties@10.1.1:
+ resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ regenerate: 1.4.2
+ dev: false
+
+ /regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+ dev: false
+
+ /regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ /regenerator-transform@0.15.2:
+ resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /regex-not@1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+ dev: true
+
+ /regexp.prototype.flags@1.5.2:
+ resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
+
+ /regexpu-core@5.3.2:
+ resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ '@babel/regjsgen': 0.8.0
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.1.1
+ regjsparser: 0.9.1
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.1.0
+ dev: false
+
+ /regjsparser@0.9.1:
+ resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
+ hasBin: true
+ dependencies:
+ jsesc: 0.5.0
+ dev: false
+
+ /rehype-highlight@6.0.0:
+ resolution: {integrity: sha512-q7UtlFicLhetp7K48ZgZiJgchYscMma7XjzX7t23bqEJF8m6/s+viXQEe4oHjrATTIZpX7RG8CKD7BlNZoh9gw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ hast-util-to-text: 3.1.2
+ lowlight: 2.9.0
+ unified: 10.1.2
+ unist-util-visit: 4.1.2
+ dev: false
+
+ /rehype-raw@6.1.1:
+ resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==}
+ dependencies:
+ '@types/hast': 2.3.10
+ hast-util-raw: 7.2.3
+ unified: 10.1.2
+ dev: false
+
+ /remark-gfm@3.0.1:
+ resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-gfm: 2.0.2
+ micromark-extension-gfm: 2.0.3
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-parse@10.0.2:
+ resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-parse@6.0.3:
+ resolution: {integrity: sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==}
+ dependencies:
+ collapse-white-space: 1.0.6
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+ is-whitespace-character: 1.0.4
+ is-word-character: 1.0.4
+ markdown-escapes: 1.0.4
+ parse-entities: 1.2.2
+ repeat-string: 1.6.1
+ state-toggle: 1.0.3
+ trim: 0.0.1
+ trim-trailing-lines: 1.1.4
+ unherit: 1.1.3
+ unist-util-remove-position: 1.1.4
+ vfile-location: 2.0.6
+ xtend: 4.0.2
+ dev: true
+
+ /remark-rehype@10.1.0:
+ resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-to-hast: 12.3.0
+ unified: 10.1.2
+ dev: false
+
+ /remark-stringify@6.0.4:
+ resolution: {integrity: sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==}
+ dependencies:
+ ccount: 1.1.0
+ is-alphanumeric: 1.0.0
+ is-decimal: 1.0.4
+ is-whitespace-character: 1.0.4
+ longest-streak: 2.0.4
+ markdown-escapes: 1.0.4
+ markdown-table: 1.1.3
+ mdast-util-compact: 1.0.4
+ parse-entities: 1.2.2
+ repeat-string: 1.6.1
+ state-toggle: 1.0.3
+ stringify-entities: 1.3.2
+ unherit: 1.1.3
+ xtend: 4.0.2
+ dev: true
+
+ /remark@10.0.1:
+ resolution: {integrity: sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==}
+ dependencies:
+ remark-parse: 6.0.3
+ remark-stringify: 6.0.4
+ unified: 7.1.0
+ dev: true
+
+ /remove-accents@0.4.4:
+ resolution: {integrity: sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==}
+ dev: false
+
+ /repeat-element@1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /replace-ext@1.0.0:
+ resolution: {integrity: sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==}
+ engines: {node: '>= 0.10'}
+ dev: true
+
+ /require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /reset-css@5.0.2:
+ resolution: {integrity: sha512-YtgUGSq5z5W0NPSjsBW7ys7rtWa8P8AiE7S6Fg3d1TQCPpAodgYyLuZYlU0AOsLtprk/fC9ormHN/0pAavVIDw==}
+ dev: false
+
+ /resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+ dev: false
+
+ /resolve-from@3.0.0:
+ resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ /resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-global@1.0.0:
+ resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==}
+ engines: {node: '>=8'}
+ dependencies:
+ global-dirs: 0.1.1
+ dev: true
+
+ /resolve-url@0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+ dev: true
+
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.15.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ /resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.15.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+ dev: true
+
+ /rimraf@2.6.3:
+ resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup-plugin-visualizer@5.9.2:
+ resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==}
+ engines: {node: '>=14'}
+ hasBin: true
+ peerDependencies:
+ rollup: 2.x || 3.x
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+ dependencies:
+ open: 8.4.2
+ picomatch: 2.3.1
+ source-map: 0.7.4
+ yargs: 17.7.2
+ dev: true
+
+ /rollup@3.29.4:
+ resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /rtl-css-js@1.16.1:
+ resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==}
+ dependencies:
+ '@babel/runtime': 7.25.0
+ dev: false
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: false
+
+ /safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+ dev: true
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-regex: 1.1.4
+ dev: true
+
+ /safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+ dependencies:
+ ret: 0.1.15
+ dev: true
+
+ /sass@1.69.3:
+ resolution: {integrity: sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.6.0
+ immutable: 4.3.7
+ source-map-js: 1.2.0
+
+ /scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /screenfull@5.2.0:
+ resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /screenfull@6.0.2:
+ resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ dev: false
+
+ /scroll-into-view-if-needed@3.1.0:
+ resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
+ dependencies:
+ compute-scroll-into-view: 3.1.0
+ dev: false
+
+ /semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ /semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /server-only@0.0.1:
+ resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
+ dev: false
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ 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:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ /set-harmonic-interval@1.0.1:
+ resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
+ engines: {node: '>=6.9'}
+ dev: false
+
+ /set-value@2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+ dev: true
+
+ /shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+ dev: false
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.2
+
+ /signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ dependencies:
+ is-arrayish: 0.3.2
+ dev: false
+
+ /simplebar-core@1.2.6:
+ resolution: {integrity: sha512-H5NYU+O+uvqOH5VXw3+lgoc1vTI6jL8LOZJsw4xgRpV7uIPjRpmLPdz0TrouxwKHBhpVLzVIlyKhaRLelIThMw==}
+ dependencies:
+ '@types/lodash-es': 4.17.12
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ dev: false
+
+ /simplebar-react@3.2.4(react@18.2.0):
+ resolution: {integrity: sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 18.2.0
+ simplebar-core: 1.2.6
+ dev: false
+
+ /slash@2.0.0:
+ resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==}
+ engines: {node: '>=6'}
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slice-ansi@2.1.0:
+ resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-styles: 3.2.1
+ astral-regex: 1.0.0
+ is-fullwidth-code-point: 2.0.0
+ dev: true
+
+ /slice-ansi@4.0.0:
+ resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ astral-regex: 2.0.0
+ is-fullwidth-code-point: 3.0.0
+ dev: true
+
+ /slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+ dev: true
+
+ /snapdragon-node@2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+ dev: true
+
+ /snapdragon-util@3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /snapdragon@0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map-resolve@0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+ dev: true
+
+ /source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ /source-map-url@0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+ dev: true
+
+ /source-map@0.5.6:
+ resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+ dev: false
+
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.18
+ dev: true
+
+ /spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.18
+ dev: true
+
+ /spdx-license-ids@3.0.18:
+ resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
+ dev: true
+
+ /specificity@0.4.1:
+ resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==}
+ hasBin: true
+ dev: true
+
+ /split-string@3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ extend-shallow: 3.0.2
+ dev: true
+
+ /split2@3.2.2:
+ resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+ dependencies:
+ readable-stream: 3.6.2
+ dev: true
+
+ /sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ dev: true
+
+ /stable@0.1.8:
+ resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+ deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+ dev: true
+
+ /stack-generator@2.0.10:
+ resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==}
+ dependencies:
+ stackframe: 1.3.4
+ dev: false
+
+ /stackframe@1.3.4:
+ resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+ dev: false
+
+ /stacktrace-gps@3.1.2:
+ resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==}
+ dependencies:
+ source-map: 0.5.6
+ stackframe: 1.3.4
+ dev: false
+
+ /stacktrace-js@2.0.2:
+ resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==}
+ dependencies:
+ error-stack-parser: 2.1.4
+ stack-generator: 2.0.10
+ stacktrace-gps: 3.1.2
+ dev: false
+
+ /state-toggle@1.0.3:
+ resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==}
+ dev: true
+
+ /static-extend@0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+ dev: true
+
+ /statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /strict-event-emitter@0.5.1:
+ resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
+ dev: true
+
+ /strict-uri-encode@1.1.0:
+ resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+ dev: true
+
+ /string-convert@0.2.1:
+ resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+ dev: false
+
+ /string-width@3.1.0:
+ resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==}
+ engines: {node: '>=6'}
+ dependencies:
+ emoji-regex: 7.0.3
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 5.2.0
+ dev: true
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+ dev: true
+
+ /string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.7
+ regexp.prototype.flags: 1.5.2
+ set-function-name: 2.0.2
+ side-channel: 1.0.6
+ dev: true
+
+ /string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /stringify-entities@1.3.2:
+ resolution: {integrity: sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==}
+ dependencies:
+ character-entities-html4: 1.1.4
+ character-entities-legacy: 1.1.4
+ is-alphanumerical: 1.0.4
+ is-hexadecimal: 1.0.4
+ dev: true
+
+ /strip-ansi@3.0.1:
+ resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ ansi-regex: 2.1.1
+ dev: true
+
+ /strip-ansi@5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-regex: 4.1.1
+ dev: true
+
+ /strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent@2.0.0:
+ resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-indent@4.0.0:
+ resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
+ engines: {node: '>=12'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strnum@1.0.5:
+ resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
+ dev: false
+
+ /style-search@0.1.0:
+ resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+ dev: true
+
+ /style-to-object@0.4.4:
+ resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+ dependencies:
+ inline-style-parser: 0.1.1
+ dev: false
+
+ /styled-components@6.0.9(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-dDEXXF66b4iQhI1YHgvkBqfdJPGj2EifyLd298PVs50nz7KDfBKnAmWVnkZtw6+Nb6Izf19BAUyfYy8p434JAg==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ babel-plugin-styled-components: '>= 2'
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ peerDependenciesMeta:
+ babel-plugin-styled-components:
+ optional: true
+ dependencies:
+ '@babel/cli': 7.24.8(@babel/core@7.25.2)
+ '@babel/core': 7.25.2
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/plugin-external-helpers': 7.24.7(@babel/core@7.25.2)
+ '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2)
+ '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2)
+ '@babel/preset-env': 7.25.3(@babel/core@7.25.2)
+ '@babel/preset-react': 7.24.7(@babel/core@7.25.2)
+ '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2)
+ '@babel/traverse': 7.25.3
+ '@emotion/is-prop-valid': 1.3.0
+ '@emotion/unitless': 0.8.1
+ '@types/stylis': 4.2.6
+ css-to-react-native: 3.2.0
+ csstype: 3.1.3
+ postcss: 8.4.31
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ shallowequal: 1.1.0
+ stylis: 4.3.2
+ tslib: 2.6.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /stylelint-config-rational-order@0.1.2:
+ resolution: {integrity: sha512-Qo7ZQaihCwTqijfZg4sbdQQHtugOX/B1/fYh018EiDZHW+lkqH9uHOnsDwDPGZrYJuB6CoyI7MZh2ecw2dOkew==}
+ dependencies:
+ stylelint: 9.10.1
+ stylelint-order: 2.2.1(stylelint@9.10.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /stylelint-config-recommended@12.0.0(stylelint@15.10.3):
+ resolution: {integrity: sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==}
+ peerDependencies:
+ stylelint: ^15.5.0
+ dependencies:
+ stylelint: 15.10.3(typescript@5.2.2)
+ dev: true
+
+ /stylelint-config-standard@33.0.0(stylelint@15.10.3):
+ resolution: {integrity: sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==}
+ peerDependencies:
+ stylelint: ^15.5.0
+ dependencies:
+ stylelint: 15.10.3(typescript@5.2.2)
+ stylelint-config-recommended: 12.0.0(stylelint@15.10.3)
+ dev: true
+
+ /stylelint-declaration-block-no-ignored-properties@2.7.0(stylelint@15.10.3):
+ resolution: {integrity: sha512-44SpI9+9Oc1ICuwwRfwS/3npQ2jPobDSTnwWdNgZGryGqQCp17CgEIWjCv1BgUOSzND3RqywNCNLKvO1AOxbfg==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
+ dependencies:
+ stylelint: 15.10.3(typescript@5.2.2)
+ dev: true
+
+ /stylelint-order@2.2.1(stylelint@9.10.1):
+ resolution: {integrity: sha512-019KBV9j8qp1MfBjJuotse6MgaZqGVtXMc91GU9MsS9Feb+jYUvUU3Z8XiClqPdqJZQ0ryXQJGg3U3PcEjXwfg==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ stylelint: ^9.10.1 || ^10.0.0
+ dependencies:
+ lodash: 4.17.21
+ postcss: 7.0.39
+ postcss-sorting: 4.1.0
+ stylelint: 9.10.1
+ dev: true
+
+ /stylelint-order@6.0.3(stylelint@15.10.3):
+ resolution: {integrity: sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==}
+ peerDependencies:
+ stylelint: ^14.0.0 || ^15.0.0
+ dependencies:
+ postcss: 8.4.31
+ postcss-sorting: 8.0.2(postcss@8.4.31)
+ stylelint: 15.10.3(typescript@5.2.2)
+ dev: true
+
+ /stylelint@15.10.3(typescript@5.2.2):
+ resolution: {integrity: sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
+ '@csstools/css-tokenizer': 2.4.1
+ '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1)
+ '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2)
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 8.3.6(typescript@5.2.2)
+ css-functions-list: 3.2.2
+ css-tree: 2.3.1
+ debug: 4.3.6
+ fast-glob: 3.3.2
+ fastest-levenshtein: 1.0.16
+ file-entry-cache: 6.0.1
+ global-modules: 2.0.0
+ globby: 11.1.0
+ globjoin: 0.1.4
+ html-tags: 3.3.1
+ ignore: 5.3.2
+ import-lazy: 4.0.0
+ imurmurhash: 0.1.4
+ is-plain-object: 5.0.0
+ known-css-properties: 0.28.0
+ mathml-tag-names: 2.1.3
+ meow: 10.1.5
+ micromatch: 4.0.7
+ normalize-path: 3.0.0
+ picocolors: 1.0.1
+ postcss: 8.4.31
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-safe-parser: 6.0.0(postcss@8.4.31)
+ postcss-selector-parser: 6.1.2
+ postcss-value-parser: 4.2.0
+ resolve-from: 5.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ style-search: 0.1.0
+ supports-hyperlinks: 3.0.0
+ svg-tags: 1.0.0
+ table: 6.8.2
+ write-file-atomic: 5.0.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /stylelint@9.10.1:
+ resolution: {integrity: sha512-9UiHxZhOAHEgeQ7oLGwrwoDR8vclBKlSX7r4fH0iuu0SfPwFaLkb1c7Q2j1cqg9P7IDXeAV2TvQML/fRQzGBBQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dependencies:
+ autoprefixer: 9.8.8
+ balanced-match: 1.0.2
+ chalk: 2.4.2
+ cosmiconfig: 5.2.1
+ debug: 4.3.6
+ execall: 1.0.0
+ file-entry-cache: 4.0.0
+ get-stdin: 6.0.0
+ global-modules: 2.0.0
+ globby: 9.2.0
+ globjoin: 0.1.4
+ html-tags: 2.0.0
+ ignore: 5.3.2
+ import-lazy: 3.1.0
+ imurmurhash: 0.1.4
+ known-css-properties: 0.11.0
+ leven: 2.1.0
+ lodash: 4.17.21
+ log-symbols: 2.2.0
+ mathml-tag-names: 2.1.3
+ meow: 5.0.0
+ micromatch: 3.1.10
+ normalize-selector: 0.2.0
+ pify: 4.0.1
+ postcss: 7.0.39
+ postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
+ postcss-jsx: 0.36.4(postcss-syntax@0.36.2)(postcss@7.0.39)
+ postcss-less: 3.1.4
+ postcss-markdown: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
+ postcss-media-query-parser: 0.2.3
+ postcss-reporter: 6.0.1
+ postcss-resolve-nested-selector: 0.1.6
+ postcss-safe-parser: 4.0.2
+ postcss-sass: 0.3.5
+ postcss-scss: 2.1.1
+ postcss-selector-parser: 3.1.2
+ postcss-syntax: 0.36.2(postcss@8.4.31)
+ postcss-value-parser: 3.3.1
+ resolve-from: 4.0.0
+ signal-exit: 3.0.7
+ slash: 2.0.0
+ specificity: 0.4.1
+ string-width: 3.1.0
+ style-search: 0.1.0
+ sugarss: 2.0.0
+ svg-tags: 1.0.0
+ table: 5.4.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+ dev: false
+
+ /stylis@4.3.2:
+ resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==}
+ dev: false
+
+ /sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.4.5
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+ dev: true
+
+ /sugarss@2.0.0:
+ resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==}
+ dependencies:
+ postcss: 7.0.39
+ dev: true
+
+ /supports-color@2.0.0:
+ resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /supports-color@3.2.3:
+ resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+ engines: {node: '>=0.8.0'}
+ dependencies:
+ has-flag: 1.0.0
+ dev: true
+
+ /supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-hyperlinks@3.0.0:
+ resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ /svg-baker@1.7.0:
+ resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
+ dependencies:
+ bluebird: 3.7.2
+ clone: 2.1.2
+ he: 1.2.0
+ image-size: 0.5.5
+ loader-utils: 1.4.2
+ merge-options: 1.0.1
+ micromatch: 3.1.0
+ postcss: 5.2.18
+ postcss-prefix-selector: 1.16.1(postcss@5.2.18)
+ posthtml-rename-id: 1.0.12
+ posthtml-svg-mode: 1.0.3
+ query-string: 4.3.4
+ traverse: 0.6.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /svg-tags@1.0.0:
+ resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+ dev: true
+
+ /svg.draggable.js@2.2.2:
+ resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svg.easing.js@2.0.0:
+ resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svg.filter.js@2.0.2:
+ resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svg.js@2.7.1:
+ resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==}
+ dev: false
+
+ /svg.pathmorphing.js@0.1.3:
+ resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svg.resize.js@1.4.3:
+ resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ svg.select.js: 2.1.2
+ dev: false
+
+ /svg.select.js@2.1.2:
+ resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svg.select.js@3.0.1:
+ resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ svg.js: 2.7.1
+ dev: false
+
+ /svgo@2.8.0:
+ resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 4.3.0
+ css-tree: 1.1.3
+ csso: 4.2.0
+ picocolors: 1.0.1
+ stable: 0.1.8
+ dev: true
+
+ /table@5.4.6:
+ resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ ajv: 6.12.6
+ lodash: 4.17.21
+ slice-ansi: 2.1.0
+ string-width: 3.1.0
+ dev: true
+
+ /table@6.8.2:
+ resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.17.1
+ lodash.truncate: 4.4.2
+ slice-ansi: 4.0.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /tailwindcss@3.3.3(ts-node@10.9.1):
+ resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 2.1.0
+ micromatch: 4.0.7
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.0.1
+ postcss: 8.4.31
+ postcss-import: 15.1.0(postcss@8.4.31)
+ postcss-js: 4.0.1(postcss@8.4.31)
+ postcss-load-config: 4.0.2(postcss@8.4.31)(ts-node@10.9.1)
+ postcss-nested: 6.2.0(postcss@8.4.31)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+ dev: true
+
+ /terser@5.26.0:
+ resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/source-map': 0.3.6
+ acorn: 8.12.1
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ /text-extensions@1.9.0:
+ resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
+ engines: {node: '>=0.10'}
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ thenify: 3.3.1
+ dev: true
+
+ /thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ dependencies:
+ any-promise: 1.3.0
+ dev: true
+
+ /throttle-debounce@3.0.1:
+ resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /throttle-debounce@5.0.2:
+ resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+ engines: {node: '>=12.22'}
+ dev: false
+
+ /through2@4.0.2:
+ resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+ dependencies:
+ readable-stream: 3.6.2
+ dev: true
+
+ /through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+ dev: false
+
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+
+ /to-object-path@0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /to-regex-range@2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+
+ /to-regex@3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+ dev: true
+
+ /toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+ dev: false
+
+ /traverse@0.6.9:
+ resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ gopd: 1.0.1
+ typedarray.prototype.slice: 1.0.3
+ which-typed-array: 1.1.15
+ dev: true
+
+ /trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+ dev: false
+
+ /trim-newlines@2.0.0:
+ resolution: {integrity: sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /trim-newlines@3.0.1:
+ resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /trim-newlines@4.1.1:
+ resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /trim-trailing-lines@1.1.4:
+ resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==}
+ dev: true
+
+ /trim@0.0.1:
+ resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==}
+ deprecated: Use String.prototype.trim() instead
+ dev: true
+
+ /trough@1.0.5:
+ resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==}
+ dev: true
+
+ /trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+ dev: false
+
+ /ts-easing@0.2.0:
+ resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
+ dev: false
+
+ /ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ dev: true
+
+ /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.2.2):
+ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.5.1
+ acorn: 8.12.1
+ acorn-walk: 8.3.3
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.2.2
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /ts-node@10.9.1(@types/node@22.4.1)(typescript@5.2.2):
+ resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 22.4.1
+ acorn: 8.12.1
+ acorn-walk: 8.3.3
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.2.2
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ dev: true
+
+ /ts-toolbelt@9.6.0:
+ resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+ dev: true
+
+ /tsconfck@2.1.2(typescript@5.2.2):
+ resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==}
+ engines: {node: ^14.13.1 || ^16 || >=18}
+ hasBin: true
+ peerDependencies:
+ typescript: ^4.3.5 || ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ typescript: 5.2.2
+ dev: true
+
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tslib@2.6.3:
+ resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ dev: false
+
+ /tsutils@3.21.0(typescript@5.2.2):
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.2.2
+ dev: true
+
+ /type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-fest@0.18.1:
+ resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@4.25.0:
+ resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+ dev: true
+
+ /typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
+
+ /typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: true
+
+ /typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
+ dev: true
+
+ /typedarray.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ typed-array-buffer: 1.0.2
+ typed-array-byte-offset: 1.0.2
+ dev: true
+
+ /types-ramda@0.29.10:
+ resolution: {integrity: sha512-5PJiW/eiTPyXXBYGZOYGezMl6qj7keBiZheRwfjJZY26QPHsNrjfJnz0mru6oeqqoTHOni893Jfd6zyUXfQRWg==}
+ dependencies:
+ ts-toolbelt: 9.6.0
+ dev: true
+
+ /typescript@5.2.2:
+ resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.7
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /undici-types@6.19.6:
+ resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==}
+
+ /unherit@1.1.3:
+ resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==}
+ dependencies:
+ inherits: 2.0.4
+ xtend: 4.0.2
+ dev: true
+
+ /unicode-canonical-property-names-ecmascript@2.0.0:
+ resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.0
+ unicode-property-aliases-ecmascript: 2.1.0
+ dev: false
+
+ /unicode-match-property-value-ecmascript@2.1.0:
+ resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unicode-property-aliases-ecmascript@2.1.0:
+ resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unified@10.1.2:
+ resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+ dependencies:
+ '@types/unist': 2.0.11
+ bail: 2.0.2
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 5.3.7
+ dev: false
+
+ /unified@7.1.0:
+ resolution: {integrity: sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ '@types/vfile': 3.0.2
+ bail: 1.0.5
+ extend: 3.0.2
+ is-plain-obj: 1.1.0
+ trough: 1.0.5
+ vfile: 3.0.1
+ x-is-string: 0.1.0
+ dev: true
+
+ /union-value@1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+ dev: true
+
+ /uniq@1.0.1:
+ resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==}
+ dev: true
+
+ /unist-util-find-after@4.0.1:
+ resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ dev: false
+
+ /unist-util-find-all-after@1.0.5:
+ resolution: {integrity: sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==}
+ dependencies:
+ unist-util-is: 3.0.0
+ dev: true
+
+ /unist-util-generated@2.0.1:
+ resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
+ dev: false
+
+ /unist-util-is@3.0.0:
+ resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==}
+ dev: true
+
+ /unist-util-is@5.2.1:
+ resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-position@4.0.4:
+ resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-remove-position@1.1.4:
+ resolution: {integrity: sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==}
+ dependencies:
+ unist-util-visit: 1.4.1
+ dev: true
+
+ /unist-util-stringify-position@1.1.2:
+ resolution: {integrity: sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==}
+ dev: true
+
+ /unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+ dependencies:
+ '@types/unist': 3.0.3
+ dev: true
+
+ /unist-util-visit-parents@2.1.2:
+ resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==}
+ dependencies:
+ unist-util-is: 3.0.0
+ dev: true
+
+ /unist-util-visit-parents@5.1.3:
+ resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ dev: false
+
+ /unist-util-visit@1.4.1:
+ resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==}
+ dependencies:
+ unist-util-visit-parents: 2.1.2
+ dev: true
+
+ /unist-util-visit@4.1.2:
+ resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+ dev: false
+
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+ dev: true
+
+ /unset-value@1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+ dev: true
+
+ /update-browserslist-db@1.1.0(browserslist@4.23.3):
+ resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.23.3
+ escalade: 3.1.2
+ picocolors: 1.0.1
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /urix@0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+ dev: true
+
+ /use-memo-one@1.1.3(react@18.2.0):
+ resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /use-sync-external-store@1.2.0(react@18.2.0):
+ resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /use@3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+ dev: false
+
+ /uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.2.0
+ kleur: 4.1.5
+ sade: 1.8.1
+ dev: false
+
+ /v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ dev: true
+
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /vfile-location@2.0.6:
+ resolution: {integrity: sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==}
+ dev: true
+
+ /vfile-location@4.1.0:
+ resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ vfile: 5.3.7
+ dev: false
+
+ /vfile-message@1.1.1:
+ resolution: {integrity: sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==}
+ dependencies:
+ unist-util-stringify-position: 1.1.2
+ dev: true
+
+ /vfile-message@3.1.4:
+ resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-stringify-position: 3.0.3
+ dev: false
+
+ /vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+ dev: true
+
+ /vfile@3.0.1:
+ resolution: {integrity: sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==}
+ dependencies:
+ is-buffer: 2.0.5
+ replace-ext: 1.0.0
+ unist-util-stringify-position: 1.1.2
+ vfile-message: 1.1.1
+ dev: true
+
+ /vfile@5.3.7:
+ resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+ dependencies:
+ '@types/unist': 2.0.11
+ is-buffer: 2.0.5
+ unist-util-stringify-position: 3.0.3
+ vfile-message: 3.1.4
+ dev: false
+
+ /vite-plugin-svg-icons@2.0.1(vite@4.4.11):
+ resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+ peerDependencies:
+ vite: '>=2.0.0'
+ dependencies:
+ '@types/svgo': 2.6.4
+ cors: 2.8.5
+ debug: 4.3.6
+ etag: 1.8.1
+ fs-extra: 10.1.0
+ pathe: 0.2.0
+ svg-baker: 1.7.0
+ svgo: 2.8.0
+ vite: 4.4.11(@types/node@22.4.1)(sass@1.69.3)(terser@5.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.4.11):
+ resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ debug: 4.3.6
+ globrex: 0.1.2
+ tsconfck: 2.1.2(typescript@5.2.2)
+ vite: 4.4.11(@types/node@22.4.1)(sass@1.69.3)(terser@5.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /vite@4.4.11(@types/node@22.4.1)(sass@1.69.3)(terser@5.26.0):
+ resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>= 14'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': 22.4.1
+ esbuild: 0.18.20
+ postcss: 8.4.31
+ rollup: 3.29.4
+ sass: 1.69.3
+ terser: 5.26.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /void-elements@3.1.0:
+ resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+ dev: false
+
+ /which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ dev: true
+
+ /which-builtin-type@1.1.4:
+ resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function.prototype.name: 1.1.6
+ has-tostringtag: 1.0.2
+ is-async-function: 2.0.0
+ is-date-object: 1.0.5
+ is-finalizationregistry: 1.0.2
+ is-generator-function: 1.0.10
+ is-regex: 1.1.4
+ is-weakref: 1.0.2
+ isarray: 2.0.5
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.2
+ which-typed-array: 1.1.15
+ dev: true
+
+ /which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.3
+ dev: true
+
+ /which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ /write-file-atomic@5.0.1:
+ resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 4.1.0
+ dev: true
+
+ /write@1.0.3:
+ resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==}
+ engines: {node: '>=4'}
+ dependencies:
+ mkdirp: 0.5.6
+ dev: true
+
+ /x-is-string@0.1.0:
+ resolution: {integrity: sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==}
+ dev: true
+
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: true
+
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /yaml@2.3.1:
+ resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /yaml@2.5.0:
+ resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
+ engines: {node: '>= 14'}
+ hasBin: true
+ dev: true
+
+ /yargs-parser@10.1.0:
+ resolution: {integrity: sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==}
+ dependencies:
+ camelcase: 4.1.0
+ dev: true
+
+ /yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.1.2
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /zustand@4.4.3(@types/react@18.2.28)(react@18.2.0):
+ resolution: {integrity: sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==}
+ engines: {node: '>=12.7.0'}
+ peerDependencies:
+ '@types/react': '>=16.8'
+ immer: '>=9.0'
+ react: '>=16.8'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ dependencies:
+ '@types/react': 18.2.28
+ react: 18.2.0
+ use-sync-external-store: 1.2.0(react@18.2.0)
+ dev: false
+
+ /zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+ dev: false
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..e61a917
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,8 @@
+export default {
+ plugins: {
+ 'postcss-import': {},
+ 'tailwindcss/nesting': 'postcss-nesting',
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js
new file mode 100644
index 0000000..e891a68
--- /dev/null
+++ b/public/mockServiceWorker.js
@@ -0,0 +1,284 @@
+/* eslint-disable */
+/* tslint:disable */
+
+/**
+ * Mock Service Worker.
+ * @see https://github.com/mswjs/msw
+ * - Please do NOT modify this file.
+ * - Please do NOT serve this file on production.
+ */
+
+const PACKAGE_VERSION = '2.2.14'
+const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423'
+const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
+const activeClientIds = new Set()
+
+self.addEventListener('install', function () {
+ self.skipWaiting()
+})
+
+self.addEventListener('activate', function (event) {
+ event.waitUntil(self.clients.claim())
+})
+
+self.addEventListener('message', async function (event) {
+ const clientId = event.source.id
+
+ if (!clientId || !self.clients) {
+ return
+ }
+
+ const client = await self.clients.get(clientId)
+
+ if (!client) {
+ return
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window',
+ })
+
+ switch (event.data) {
+ case 'KEEPALIVE_REQUEST': {
+ sendToClient(client, {
+ type: 'KEEPALIVE_RESPONSE',
+ })
+ break
+ }
+
+ case 'INTEGRITY_CHECK_REQUEST': {
+ sendToClient(client, {
+ type: 'INTEGRITY_CHECK_RESPONSE',
+ payload: {
+ packageVersion: PACKAGE_VERSION,
+ checksum: INTEGRITY_CHECKSUM,
+ },
+ })
+ break
+ }
+
+ case 'MOCK_ACTIVATE': {
+ activeClientIds.add(clientId)
+
+ sendToClient(client, {
+ type: 'MOCKING_ENABLED',
+ payload: true,
+ })
+ break
+ }
+
+ case 'MOCK_DEACTIVATE': {
+ activeClientIds.delete(clientId)
+ break
+ }
+
+ case 'CLIENT_CLOSED': {
+ activeClientIds.delete(clientId)
+
+ const remainingClients = allClients.filter((client) => {
+ return client.id !== clientId
+ })
+
+ // Unregister itself when there are no more clients
+ if (remainingClients.length === 0) {
+ self.registration.unregister()
+ }
+
+ break
+ }
+ }
+})
+
+self.addEventListener('fetch', function (event) {
+ const { request } = event
+
+ // Bypass navigation requests.
+ if (request.mode === 'navigate') {
+ return
+ }
+
+ // Opening the DevTools triggers the "only-if-cached" request
+ // that cannot be handled by the worker. Bypass such requests.
+ if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
+ return
+ }
+
+ // Bypass all requests when there are no active clients.
+ // Prevents the self-unregistered worked from handling requests
+ // after it's been deleted (still remains active until the next reload).
+ if (activeClientIds.size === 0) {
+ return
+ }
+
+ // Generate unique request ID.
+ const requestId = crypto.randomUUID()
+ event.respondWith(handleRequest(event, requestId))
+})
+
+async function handleRequest(event, requestId) {
+ const client = await resolveMainClient(event)
+ const response = await getResponse(event, client, requestId)
+
+ // Send back the response clone for the "response:*" life-cycle events.
+ // Ensure MSW is active and ready to handle the message, otherwise
+ // this message will pend indefinitely.
+ if (client && activeClientIds.has(client.id)) {
+ ;(async function () {
+ const responseClone = response.clone()
+
+ sendToClient(
+ client,
+ {
+ type: 'RESPONSE',
+ payload: {
+ requestId,
+ isMockedResponse: IS_MOCKED_RESPONSE in response,
+ type: responseClone.type,
+ status: responseClone.status,
+ statusText: responseClone.statusText,
+ body: responseClone.body,
+ headers: Object.fromEntries(responseClone.headers.entries()),
+ },
+ },
+ [responseClone.body],
+ )
+ })()
+ }
+
+ return response
+}
+
+// Resolve the main client for the given event.
+// Client that issues a request doesn't necessarily equal the client
+// that registered the worker. It's with the latter the worker should
+// communicate with during the response resolving phase.
+async function resolveMainClient(event) {
+ const client = await self.clients.get(event.clientId)
+
+ if (client?.frameType === 'top-level') {
+ return client
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window',
+ })
+
+ return allClients
+ .filter((client) => {
+ // Get only those clients that are currently visible.
+ return client.visibilityState === 'visible'
+ })
+ .find((client) => {
+ // Find the client ID that's recorded in the
+ // set of clients that have registered the worker.
+ return activeClientIds.has(client.id)
+ })
+}
+
+async function getResponse(event, client, requestId) {
+ const { request } = event
+
+ // Clone the request because it might've been already used
+ // (i.e. its body has been read and sent to the client).
+ const requestClone = request.clone()
+
+ function passthrough() {
+ const headers = Object.fromEntries(requestClone.headers.entries())
+
+ // Remove internal MSW request header so the passthrough request
+ // complies with any potential CORS preflight checks on the server.
+ // Some servers forbid unknown request headers.
+ delete headers['x-msw-intention']
+
+ return fetch(requestClone, { headers })
+ }
+
+ // Bypass mocking when the client is not active.
+ if (!client) {
+ return passthrough()
+ }
+
+ // Bypass initial page load requests (i.e. static assets).
+ // The absence of the immediate/parent client in the map of the active clients
+ // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
+ // and is not ready to handle requests.
+ if (!activeClientIds.has(client.id)) {
+ return passthrough()
+ }
+
+ // Notify the client that a request has been intercepted.
+ const requestBuffer = await request.arrayBuffer()
+ const clientMessage = await sendToClient(
+ client,
+ {
+ type: 'REQUEST',
+ payload: {
+ id: requestId,
+ url: request.url,
+ mode: request.mode,
+ method: request.method,
+ headers: Object.fromEntries(request.headers.entries()),
+ cache: request.cache,
+ credentials: request.credentials,
+ destination: request.destination,
+ integrity: request.integrity,
+ redirect: request.redirect,
+ referrer: request.referrer,
+ referrerPolicy: request.referrerPolicy,
+ body: requestBuffer,
+ keepalive: request.keepalive,
+ },
+ },
+ [requestBuffer],
+ )
+
+ switch (clientMessage.type) {
+ case 'MOCK_RESPONSE': {
+ return respondWithMock(clientMessage.data)
+ }
+
+ case 'PASSTHROUGH': {
+ return passthrough()
+ }
+ }
+
+ return passthrough()
+}
+
+function sendToClient(client, message, transferrables = []) {
+ return new Promise((resolve, reject) => {
+ const channel = new MessageChannel()
+
+ channel.port1.onmessage = (event) => {
+ if (event.data && event.data.error) {
+ return reject(event.data.error)
+ }
+
+ resolve(event.data)
+ }
+
+ client.postMessage(
+ message,
+ [channel.port2].concat(transferrables.filter(Boolean)),
+ )
+ })
+}
+
+async function respondWithMock(response) {
+ // Setting response status code to 0 is a no-op.
+ // However, when responding with a "Response.error()", the produced Response
+ // instance will have status code set to 0. Since it's not possible to create
+ // a Response instance with status code 0, handle that use-case separately.
+ if (response.status === 0) {
+ return Response.error()
+ }
+
+ const mockedResponse = new Response(response.body, response)
+
+ Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
+ value: true,
+ enumerable: true,
+ })
+
+ return mockedResponse
+}
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..98103af
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,27 @@
+import { App as AntdApp } from 'antd';
+import { Helmet } from 'react-helmet-async';
+
+import Logo from '@/assets/images/logo.png';
+import Router from '@/router/index';
+import AntdConfig from '@/theme/antd';
+
+import { MotionLazy } from './components/animate/motion-lazy';
+
+function App() {
+ return (
+
+
+
+
+ Advertising Admin
+
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/src/_mock/assets.js b/src/_mock/assets.js
new file mode 100644
index 0000000..bf27b3d
--- /dev/null
+++ b/src/_mock/assets.js
@@ -0,0 +1,468 @@
+import { faker } from '@faker-js/faker';
+
+import { BasicStatus, PermissionType } from '#/enum';
+
+/**
+ * Organization data mock
+ */
+export const ORG_LIST = [
+ {
+ id: '1',
+ name: 'East China Branch',
+ status: 'enable',
+ desc: faker.lorem.words(),
+ order: 1,
+ children: [
+ { id: '1-1', name: 'R&D Department', status: 'disable', desc: '', order: 1 },
+ { id: '1-2', name: 'Marketing Department', status: 'enable', desc: '', order: 2 },
+ { id: '1-3', name: 'Finance Department', status: 'enable', desc: '', order: 3 },
+ ],
+ },
+ {
+ id: '2',
+ name: 'South China Branch',
+ status: 'enable',
+ desc: faker.lorem.words(),
+ order: 2,
+ children: [
+ { id: '2-1', name: 'R&D Department', status: 'disable', desc: '', order: 1 },
+ { id: '2-2', name: 'Marketing Department', status: 'enable', desc: '', order: 2 },
+ { id: '2-3', name: 'Finance Department', status: 'enable', desc: '', order: 3 },
+ ],
+ }
+];
+
+/**
+ * User permission mock
+ */
+const DASHBOARD_PERMISSION = {
+ id: '9100714781927703',
+ parentId: '',
+ label: 'sys.menu.dashboard',
+ name: 'Dashboard',
+ icon: 'ic-analysis',
+ type: PermissionType.CATALOGUE,
+ route: 'dashboard',
+ order: 1,
+ children: [
+ {
+ id: '8426999229400979',
+ parentId: '9100714781927703',
+ label: 'sys.menu.workbench',
+ name: 'Workbench',
+ type: PermissionType.MENU,
+ route: 'workbench',
+ component: '/dashboard/workbench/index.tsx',
+ },
+ {
+ id: '9710971640510357',
+ parentId: '9100714781927703',
+ label: 'sys.menu.analysis',
+ name: 'Analysis',
+ type: PermissionType.MENU,
+ route: 'analysis',
+ component: '/dashboard/analysis/index.tsx',
+ },
+ ],
+};
+const MANAGEMENT_PERMISSION = {
+ id: '0901673425580518',
+ parentId: '',
+ label: 'sys.menu.management',
+ name: 'Management',
+ icon: 'ic-management',
+ type: PermissionType.CATALOGUE,
+ route: 'management',
+ order: 2,
+ children: [
+ {
+ id: '2781684678535711',
+ parentId: '0901673425580518',
+ label: 'sys.menu.user.index',
+ name: 'User',
+ type: PermissionType.CATALOGUE,
+ route: 'user',
+ children: [
+ {
+ id: '4754063958766648',
+ parentId: '2781684678535711',
+ label: 'sys.menu.user.profile',
+ name: 'Profile',
+ type: PermissionType.MENU,
+ route: 'profile',
+ component: '/management/user/profile/index.tsx',
+ },
+ {
+ id: '2516598794787938',
+ parentId: '2781684678535711',
+ label: 'sys.menu.user.account',
+ name: 'Account',
+ type: PermissionType.MENU,
+ route: 'account',
+ component: '/management/user/account/index.tsx',
+ },
+ ],
+ },
+ {
+ id: '0249937641030250',
+ parentId: '0901673425580518',
+ label: 'sys.menu.system.index',
+ name: 'System',
+ type: PermissionType.CATALOGUE,
+ route: 'system',
+ children: [
+ {
+ id: '1985890042972842',
+ parentId: '0249937641030250',
+ label: 'sys.menu.system.organization',
+ name: 'Organization',
+ type: PermissionType.MENU,
+ route: 'organization',
+ component: '/management/system/organization/index.tsx',
+ },
+ {
+ id: '4359580910369984',
+ parentId: '0249937641030250',
+ label: 'sys.menu.system.permission',
+ name: 'Permission',
+ type: PermissionType.MENU,
+ route: 'permission',
+ component: '/management/system/permission/index.tsx',
+ },
+ {
+ id: '1689241785490759',
+ parentId: '0249937641030250',
+ label: 'sys.menu.system.role',
+ name: 'Role',
+ type: PermissionType.MENU,
+ route: 'role',
+ component: '/management/system/role/index.tsx',
+ },
+ {
+ id: '0157880245365433',
+ parentId: '0249937641030250',
+ label: 'sys.menu.system.user',
+ name: 'User',
+ type: PermissionType.MENU,
+ route: 'user',
+ component: '/management/system/user/index.tsx',
+ },
+ {
+ id: '0157880245365434',
+ parentId: '0249937641030250',
+ label: 'sys.menu.system.user_detail',
+ name: 'User Detail',
+ type: PermissionType.MENU,
+ route: 'user/:id',
+ component: '/management/system/user/detail.tsx',
+ hide: true,
+ },
+ ],
+ },
+ ],
+};
+const COMPONENTS_PERMISSION = {
+ id: '2271615060673773',
+ parentId: '',
+ label: 'sys.menu.components',
+ name: 'Components',
+ icon: 'solar:widget-5-bold-duotone',
+ type: PermissionType.CATALOGUE,
+ route: 'components',
+ order: 3,
+ children: [
+ {
+ id: '2478488238255411',
+ parentId: '2271615060673773',
+ label: 'sys.menu.icon',
+ name: 'Icon',
+ type: PermissionType.MENU,
+ route: 'icon',
+ component: '/components/icon/index.tsx',
+ },
+ {
+ id: '6755238352318767',
+ parentId: '2271615060673773',
+ label: 'sys.menu.animate',
+ name: 'Animate',
+ type: PermissionType.MENU,
+ route: 'animate',
+ component: '/components/animate/index.tsx',
+ },
+ {
+ id: '9992476513546805',
+ parentId: '2271615060673773',
+ label: 'sys.menu.scroll',
+ name: 'Scroll',
+ type: PermissionType.MENU,
+ route: 'scroll',
+ component: '/components/scroll/index.tsx',
+ },
+ {
+ id: '1755562695856395',
+ parentId: '2271615060673773',
+ label: 'sys.menu.markdown',
+ name: 'Markdown',
+ type: PermissionType.MENU,
+ route: 'markdown',
+ component: '/components/markdown/index.tsx',
+ },
+ {
+ id: '2122547769468069',
+ parentId: '2271615060673773',
+ label: 'sys.menu.editor',
+ name: 'Editor',
+ type: PermissionType.MENU,
+ route: 'editor',
+ component: '/components/editor/index.tsx',
+ },
+ {
+ id: '2501920741714350',
+ parentId: '2271615060673773',
+ label: 'sys.menu.i18n',
+ name: 'Multi Language',
+ type: PermissionType.MENU,
+ route: 'i18n',
+ component: '/components/multi-language/index.tsx',
+ },
+ {
+ id: '2013577074467956',
+ parentId: '2271615060673773',
+ label: 'sys.menu.upload',
+ name: 'upload',
+ type: PermissionType.MENU,
+ route: 'Upload',
+ component: '/components/upload/index.tsx',
+ },
+ {
+ id: '7749726274771764',
+ parentId: '2271615060673773',
+ label: 'sys.menu.chart',
+ name: 'Chart',
+ type: PermissionType.MENU,
+ route: 'chart',
+ component: '/components/chart/index.tsx',
+ },
+ ],
+};
+const FUNCTIONS_PERMISSION = {
+ id: '8132044808088488',
+ parentId: '',
+ label: 'sys.menu.functions',
+ name: 'functions',
+ icon: 'solar:plain-2-bold-duotone',
+ type: PermissionType.CATALOGUE,
+ route: 'functions',
+ order: 4,
+ children: [
+ {
+ id: '3667930780705750',
+ parentId: '8132044808088488',
+ label: 'sys.menu.clipboard',
+ name: 'Clipboard',
+ type: PermissionType.MENU,
+ route: 'clipboard',
+ component: '/functions/clipboard/index.tsx',
+ },
+ {
+ id: '3667930780705751',
+ parentId: '8132044808088488',
+ label: 'sys.menu.token_expired',
+ name: 'Token Expired',
+ type: PermissionType.MENU,
+ route: 'token-expired',
+ component: '/functions/token-expired/index.tsx',
+ },
+ ],
+};
+const MENU_LEVEL_PERMISSION = {
+ id: '0194818428516575',
+ parentId: '',
+ label: 'sys.menu.menulevel.index',
+ name: 'Menu Level',
+ icon: 'ic-menulevel',
+ type: PermissionType.CATALOGUE,
+ route: 'menu-level',
+ order: 5,
+ children: [
+ {
+ id: '0144431332471389',
+ parentId: '0194818428516575',
+ label: 'sys.menu.menulevel.1a',
+ name: 'Menu Level 1a',
+ type: PermissionType.MENU,
+ route: 'menu-level-1a',
+ component: '/menu-level/menu-level-1a/index.tsx',
+ },
+ {
+ id: '7572529636800586',
+ parentId: '0194818428516575',
+ label: 'sys.menu.menulevel.1b.index',
+ name: 'Menu Level 1b',
+ type: PermissionType.CATALOGUE,
+ route: 'menu-level-1b',
+ children: [
+ {
+ id: '3653745576583237',
+ parentId: '7572529636800586',
+ label: 'sys.menu.menulevel.1b.2a',
+ name: 'Menu Level 2a',
+ type: PermissionType.MENU,
+ route: 'menu-level-2a',
+ component: '/menu-level/menu-level-1b/menu-level-2a/index.tsx',
+ },
+ {
+ id: '4873136353891364',
+ parentId: '7572529636800586',
+ label: 'sys.menu.menulevel.1b.2b.index',
+ name: 'Menu Level 2b',
+ type: PermissionType.CATALOGUE,
+ route: 'menu-level-2b',
+ children: [
+ {
+ id: '4233029726998055',
+ parentId: '4873136353891364',
+ label: 'sys.menu.menulevel.1b.2b.3a',
+ name: 'Menu Level 3a',
+ type: PermissionType.MENU,
+ route: 'menu-level-3a',
+ component: '/menu-level/menu-level-1b/menu-level-2b/menu-level-3a/index.tsx',
+ },
+ {
+ id: '3298034742548454',
+ parentId: '4873136353891364',
+ label: 'sys.menu.menulevel.1b.2b.3b',
+ name: 'Menu Level 3b',
+ type: PermissionType.MENU,
+ route: 'menu-level-3b',
+ component: '/menu-level/menu-level-1b/menu-level-2b/menu-level-3b/index.tsx',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+const ERRORS_PERMISSION = {
+ id: '9406067785553476',
+ parentId: '',
+ label: 'sys.menu.error.index',
+ name: 'Error',
+ icon: 'bxs:error-alt',
+ type: PermissionType.CATALOGUE,
+ route: 'error',
+ order: 6,
+ children: [
+ {
+ id: '8557056851997154',
+ parentId: '9406067785553476',
+ label: 'sys.menu.error.403',
+ name: '403',
+ type: PermissionType.MENU,
+ route: '403',
+ component: '/sys/error/Page403.tsx',
+ },
+ {
+ id: '5095669208159005',
+ parentId: '9406067785553476',
+ label: 'sys.menu.error.404',
+ name: '404',
+ type: PermissionType.MENU,
+ route: '404',
+ component: '/sys/error/Page404.tsx',
+ },
+ {
+ id: '0225992135973772',
+ parentId: '9406067785553476',
+ label: 'sys.menu.error.500',
+ name: '500',
+ type: PermissionType.MENU,
+ route: '500',
+ component: '/sys/error/Page500.tsx',
+ },
+ ],
+};
+const OTHERS_PERMISSION = [
+ {
+ id: '3513985683886393',
+ parentId: '',
+ label: 'sys.menu.text_advertising',
+ name: 'text-advertising',
+ icon: 'solar:clipboard-bold-duotone',
+ type: PermissionType.MENU,
+ route: 'text-advertising',
+ component: '/text-advertising/index.tsx',
+ },
+ {
+ id: '3513985683886394',
+ parentId: '',
+ label: 'sys.menu.banner_advertising',
+ name: 'banner-advertising',
+ icon: 'solar:widget-5-bold-duotone',
+ type: PermissionType.MENU,
+ route: 'banner-advertising',
+ component: '/banner-advertising/index.tsx',
+ },
+];
+
+export const PERMISSION_LIST = [
+ // DASHBOARD_PERMISSION,
+ // MANAGEMENT_PERMISSION,
+ // COMPONENTS_PERMISSION,
+ // FUNCTIONS_PERMISSION,
+ // MENU_LEVEL_PERMISSION,
+ // ERRORS_PERMISSION,
+ ...OTHERS_PERMISSION,
+];
+
+/**
+ * User role mock
+ */
+export const ADMIN_ROLE = {
+ id: '4281707933534332',
+ name: 'Admin',
+ label: 'admin',
+ status: BasicStatus.ENABLE,
+ order: 1,
+ desc: 'Super Admin',
+ permission: PERMISSION_LIST,
+};
+
+const TEST_ROLE = {
+ id: '9931665660771476',
+ name: 'Test',
+ label: 'test',
+ status: BasicStatus.ENABLE,
+ order: 2,
+ desc: 'test',
+ permission: [DASHBOARD_PERMISSION, COMPONENTS_PERMISSION, FUNCTIONS_PERMISSION],
+};
+export const ROLE_LIST = [ADMIN_ROLE, TEST_ROLE];
+
+/**
+ * User data mock
+ */
+export const DEFAULT_USER = {
+ id: 'b34719e1-ce46-457e-9575-99505ecee828',
+ username: 'admin',
+ email: faker.internet.email(),
+ avatar: faker.image.avatarLegacy(),
+ createdAt: faker.date.anytime(),
+ updatedAt: faker.date.recent(),
+ password: 'demo1234',
+ role: ADMIN_ROLE,
+ permissions: ADMIN_ROLE.permission,
+};
+
+export const TEST_USER = {
+ id: 'efaa20ea-4dc5-47ee-a200-8a899be29494',
+ username: 'test',
+ password: 'demo1234',
+ email: faker.internet.email(),
+ avatar: faker.image.avatarLegacy(),
+ createdAt: faker.date.anytime(),
+ updatedAt: faker.date.recent(),
+ role: TEST_ROLE,
+ permissions: TEST_ROLE.permission,
+};
+export const USER_LIST = [DEFAULT_USER, TEST_USER];
diff --git a/src/_mock/handlers/_demo.js b/src/_mock/handlers/_demo.js
new file mode 100644
index 0000000..b7d9477
--- /dev/null
+++ b/src/_mock/handlers/_demo.js
@@ -0,0 +1,9 @@
+import { http, HttpResponse } from 'msw';
+
+import { DemoApi } from '@/api/services/demoService';
+
+const mockTokenExpired = http.post(`/api${DemoApi.TOKEN_EXPIRED}`, () => {
+ return new HttpResponse(null, {status: 401})
+});
+
+export default [mockTokenExpired];
diff --git a/src/_mock/handlers/_org.js b/src/_mock/handlers/_org.js
new file mode 100644
index 0000000..8d141e7
--- /dev/null
+++ b/src/_mock/handlers/_org.js
@@ -0,0 +1,14 @@
+import { http, HttpResponse } from 'msw';
+
+import { ORG_LIST } from '@/_mock/assets';
+import { OrgApi } from '@/api/services/orgService';
+
+const orgList = http.get(`/api${OrgApi.Org}`, () => {
+ return HttpResponse.json({
+ status: 0,
+ message: '',
+ data: ORG_LIST,
+ });
+});
+
+export default [orgList];
diff --git a/src/_mock/handlers/_user.js b/src/_mock/handlers/_user.js
new file mode 100644
index 0000000..6ce6ab4
--- /dev/null
+++ b/src/_mock/handlers/_user.js
@@ -0,0 +1,46 @@
+import { faker } from '@faker-js/faker';
+import { delay, http, HttpResponse } from 'msw';
+
+import { UserApi } from '@/api/services/userService';
+
+import { USER_LIST } from '../assets';
+
+const signIn = http.post(`/api${UserApi.SignIn}`, async ({ request }) => {
+ const { username, password } = await request.json();
+
+ const user = USER_LIST.find((item) => item.username === username);
+
+ if (!user || user.password !== password) {
+ return HttpResponse.json({
+ status: 10001,
+ message: 'Incorrect username or password.',
+ });
+ }
+
+ return HttpResponse.json({
+ status: 0,
+ message: '',
+ data: {
+ user,
+ accessToken: faker.string.uuid(),
+ refreshToken: faker.string.uuid(),
+ },
+ });
+});
+
+const userList = http.get('/api/user', async () => {
+ await delay(1000);
+ return HttpResponse.json(
+ Array.from({ length: 10 }).map(() => ({
+ fullname: faker.person.fullName(),
+ email: faker.internet.email(),
+ avatar: faker.image.avatar(),
+ address: faker.location.streetAddress(),
+ })),
+ {
+ status: 200,
+ },
+ );
+});
+
+export default [signIn, userList];
diff --git a/src/_mock/index.js b/src/_mock/index.js
new file mode 100644
index 0000000..3fa1eb2
--- /dev/null
+++ b/src/_mock/index.js
@@ -0,0 +1,10 @@
+import { setupWorker } from 'msw/browser';
+
+import orgMockApi from './handlers/_org';
+import userMockApi from './handlers/_user';
+import demoMockApi from './handlers/_demo';
+
+const handlers = [...userMockApi, ...orgMockApi, ...demoMockApi];
+const worker = setupWorker(...handlers);
+
+export default worker
diff --git a/src/_mock/utils.js b/src/_mock/utils.js
new file mode 100644
index 0000000..87ab52d
--- /dev/null
+++ b/src/_mock/utils.js
@@ -0,0 +1,9 @@
+import { faker } from '@faker-js/faker';
+
+export const fakeAvatars = (count) => {
+ const result = [];
+ for (let index = 0; index < count; index += 1) {
+ result.push(faker.image.avatarLegacy());
+ }
+ return result;
+};
diff --git a/src/api/apiClient.ts b/src/api/apiClient.ts
new file mode 100644
index 0000000..d784145
--- /dev/null
+++ b/src/api/apiClient.ts
@@ -0,0 +1,91 @@
+import { message as Message } from 'antd';
+import axios, { AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios';
+
+import { t } from '@/locales/i18n';
+import userStore from '@/store/userStore';
+import { APP_BASE_API } from '@/utils/contant';
+
+import { Result } from '#/api';
+import { ResultEnum } from '#/enum';
+
+const axiosInstance = axios.create({
+ baseURL: APP_BASE_API,
+ timeout: 50000,
+ headers: { 'Content-Type': 'application/json;charset=utf-8' },
+});
+
+axiosInstance.interceptors.request.use(
+ (config) => {
+ const { userToken } = userStore.getState();
+ config.headers.Authorization = `${userToken.token_type} ${userToken.access_token}`;
+ return config;
+ },
+ (error) => {
+ return Promise.reject(error);
+ },
+);
+
+axiosInstance.interceptors.response.use(
+ (res: AxiosResponse) => {
+ console.log(res, 'resresF');
+ if (res.config.url === '/connect/token') {
+ if (!res.data?.access_token) {
+ throw new Error(t('sys.api.apiRequestFailed'));
+ } else {
+ return res.data;
+ }
+ }
+ if (!res.data) throw new Error(t('sys.api.apiRequestFailed'));
+
+ const { status, data, message, code } = res.data;
+ const hasSuccess = data && Reflect.has(res.data, 'status') && status === ResultEnum.SUCCESS;
+ if (hasSuccess || code === '20000') {
+ return data;
+ }
+ throw new Error(message || t('sys.api.apiRequestFailed'));
+ },
+ (error: AxiosError) => {
+ const { response, message } = error || {};
+
+ const errMsg = response?.data?.message || message || t('sys.api.errorMessage');
+ Message.error(errMsg);
+
+ const status = response?.status;
+ if (status === 401) {
+ userStore.getState().actions.clearUserInfoAndToken();
+ }
+ return Promise.reject(error);
+ },
+);
+
+class APIClient {
+ get(config: AxiosRequestConfig): Promise {
+ return this.request({ ...config, method: 'GET' });
+ }
+
+ post(config: AxiosRequestConfig): Promise {
+ return this.request({ ...config, method: 'POST' });
+ }
+
+ put(config: AxiosRequestConfig): Promise {
+ return this.request({ ...config, method: 'PUT' });
+ }
+
+ delete(config: AxiosRequestConfig): Promise {
+ return this.request({ ...config, method: 'DELETE' });
+ }
+
+ request(config: AxiosRequestConfig): Promise {
+ return new Promise((resolve, reject) => {
+ axiosInstance
+ .request>(config)
+ .then((res: AxiosResponse) => {
+ resolve(res as unknown as Promise);
+ })
+ .catch((e: Error | AxiosError) => {
+ reject(e);
+ });
+ });
+ }
+}
+export default new APIClient();
diff --git a/src/api/services/advertisingService.ts b/src/api/services/advertisingService.ts
new file mode 100644
index 0000000..e03450a
--- /dev/null
+++ b/src/api/services/advertisingService.ts
@@ -0,0 +1,50 @@
+import qs from 'qs';
+
+import { IBannerAdvertisingItem } from '@/pages/banner-advertising';
+import { IAdvertisingItem } from '@/pages/text-advertising';
+
+import apiClient from '../apiClient';
+
+export enum AdvertisingApi {
+ TEXT_ADVERTISING = '/ads/list',
+ BANNER_ADVERTISING = '/ads/banner/list',
+ ADD_ADVERTISING = '/ads/detail',
+ ADD_BANNER_ADVERTISING = '/ads/banner/detail',
+}
+
+const getTextAdvertisingList = (params?: { adsId?: string; labels?: string[] }) => {
+ const query = !params ? null : qs.stringify(params, { arrayFormat: 'repeat' });
+ return apiClient.get<{
+ list: IAdvertisingItem[];
+ total: number;
+ }>({ url: `${AdvertisingApi.TEXT_ADVERTISING}?${query}` });
+};
+
+const addTextAdvertising = (data: Partial) =>
+ apiClient.post({ url: AdvertisingApi.ADD_ADVERTISING, data });
+
+const delTextAdvertising = (params: { adsId: string }) =>
+ apiClient.delete({ url: AdvertisingApi.ADD_ADVERTISING, params });
+
+const getBannerAdvertisingList = (params?: { adsBannerId?: string; labels?: string[] }) => {
+ const query = !params ? null : qs.stringify(params, { arrayFormat: 'repeat' });
+ return apiClient.get<{
+ list: IBannerAdvertisingItem[];
+ total: number;
+ }>({ url: `${AdvertisingApi.BANNER_ADVERTISING}?${query}` });
+};
+
+const addBannerAdvertising = (data: Partial) =>
+ apiClient.post({ url: AdvertisingApi.ADD_BANNER_ADVERTISING, data });
+
+const delBannerAdvertising = (params: { adsBannerId: string }) =>
+ apiClient.delete({ url: AdvertisingApi.ADD_BANNER_ADVERTISING, params });
+
+export default {
+ getTextAdvertisingList,
+ addTextAdvertising,
+ delTextAdvertising,
+ getBannerAdvertisingList,
+ addBannerAdvertising,
+ delBannerAdvertising,
+};
diff --git a/src/api/services/demoService.ts b/src/api/services/demoService.ts
new file mode 100644
index 0000000..2b637d2
--- /dev/null
+++ b/src/api/services/demoService.ts
@@ -0,0 +1,11 @@
+import apiClient from '../apiClient';
+
+export enum DemoApi {
+ TOKEN_EXPIRED = '/user/tokenExpired',
+}
+
+const mockTokenExpired = () => apiClient.post({ url: DemoApi.TOKEN_EXPIRED });
+
+export default {
+ mockTokenExpired,
+};
diff --git a/src/api/services/orgService.ts b/src/api/services/orgService.ts
new file mode 100644
index 0000000..77263fb
--- /dev/null
+++ b/src/api/services/orgService.ts
@@ -0,0 +1,13 @@
+import apiClient from '../apiClient';
+
+import { Organization } from '#/entity';
+
+export enum OrgApi {
+ Org = '/org',
+}
+
+const getOrgList = () => apiClient.get({ url: OrgApi.Org });
+
+export default {
+ getOrgList,
+};
diff --git a/src/api/services/userService.ts b/src/api/services/userService.ts
new file mode 100644
index 0000000..6a503a1
--- /dev/null
+++ b/src/api/services/userService.ts
@@ -0,0 +1,58 @@
+import apiClient from '../apiClient';
+
+import { UserInfo, UserToken } from '#/entity';
+
+export interface SignInReq {
+ username: string;
+ password: string;
+ grant_type?: 'password';
+ scope?: 'AElfScanServer';
+ client_id?: 'AElfScanServer_App';
+}
+
+export interface SignUpReq extends SignInReq {
+ email: string;
+}
+export type SignInRes = UserToken & { user: UserInfo };
+
+export enum UserApi {
+ SignIn = '/connect/token',
+ SignUp = '/auth/signup',
+ Logout = '/auth/logout',
+ Refresh = '/auth/refresh',
+ User = '/user',
+}
+
+// Promise.resolve({
+// user: DEFAULT_USER,
+// accessToken: faker.string.uuid(),
+// refreshToken: faker.string.uuid(),
+// } as SignInRes);
+
+const signin = (data: SignInReq) => {
+ const formData = new URLSearchParams();
+ formData.append('username', data.username);
+ formData.append('password', data.password);
+ formData.append('grant_type', 'password');
+ formData.append('scope', 'AElfScanServer');
+ formData.append('client_id', 'AElfScanServer_App');
+ return apiClient.post({
+ url: UserApi.SignIn,
+ data: formData.toString(),
+ baseURL: '/',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ });
+};
+
+const signup = (data: SignUpReq) => apiClient.post({ url: UserApi.SignUp, data });
+const logout = () => apiClient.get({ url: UserApi.Logout });
+const findById = (id: string) => apiClient.get({ url: `${UserApi.User}/${id}` });
+
+export default {
+ signin,
+ signup,
+ findById,
+ logout,
+};
diff --git a/src/assets/icons/ic-analysis.svg b/src/assets/icons/ic-analysis.svg
new file mode 100644
index 0000000..1308805
--- /dev/null
+++ b/src/assets/icons/ic-analysis.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-blog.svg b/src/assets/icons/ic-blog.svg
new file mode 100644
index 0000000..eb74d96
--- /dev/null
+++ b/src/assets/icons/ic-blog.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-clear.svg b/src/assets/icons/ic-clear.svg
new file mode 100644
index 0000000..bc535b3
--- /dev/null
+++ b/src/assets/icons/ic-clear.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-dashboard.svg b/src/assets/icons/ic-dashboard.svg
new file mode 100644
index 0000000..6cbedde
--- /dev/null
+++ b/src/assets/icons/ic-dashboard.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-left-arrow.svg b/src/assets/icons/ic-left-arrow.svg
new file mode 100644
index 0000000..7301e2c
--- /dev/null
+++ b/src/assets/icons/ic-left-arrow.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-locale_en_US.svg b/src/assets/icons/ic-locale_en_US.svg
new file mode 100644
index 0000000..f3980e2
--- /dev/null
+++ b/src/assets/icons/ic-locale_en_US.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-locale_zh_CN.svg b/src/assets/icons/ic-locale_zh_CN.svg
new file mode 100644
index 0000000..b9aa7a2
--- /dev/null
+++ b/src/assets/icons/ic-locale_zh_CN.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-logo.svg b/src/assets/icons/ic-logo.svg
new file mode 100644
index 0000000..63f85c3
--- /dev/null
+++ b/src/assets/icons/ic-logo.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-management.svg b/src/assets/icons/ic-management.svg
new file mode 100644
index 0000000..281dec2
--- /dev/null
+++ b/src/assets/icons/ic-management.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic-markdown.svg b/src/assets/icons/ic-markdown.svg
new file mode 100644
index 0000000..a9f882b
--- /dev/null
+++ b/src/assets/icons/ic-markdown.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-menu.svg b/src/assets/icons/ic-menu.svg
new file mode 100644
index 0000000..c9d8d36
--- /dev/null
+++ b/src/assets/icons/ic-menu.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/assets/icons/ic-menulevel.svg b/src/assets/icons/ic-menulevel.svg
new file mode 100644
index 0000000..e557e94
--- /dev/null
+++ b/src/assets/icons/ic-menulevel.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/assets/icons/ic-reset-password.svg b/src/assets/icons/ic-reset-password.svg
new file mode 100644
index 0000000..cf9e8c3
--- /dev/null
+++ b/src/assets/icons/ic-reset-password.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-right-arrow.svg b/src/assets/icons/ic-right-arrow.svg
new file mode 100644
index 0000000..9400f21
--- /dev/null
+++ b/src/assets/icons/ic-right-arrow.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-search.svg b/src/assets/icons/ic-search.svg
new file mode 100644
index 0000000..d06a451
--- /dev/null
+++ b/src/assets/icons/ic-search.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-setting.svg b/src/assets/icons/ic-setting.svg
new file mode 100644
index 0000000..48468ac
--- /dev/null
+++ b/src/assets/icons/ic-setting.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic-settings-exit-fullscreen.svg b/src/assets/icons/ic-settings-exit-fullscreen.svg
new file mode 100644
index 0000000..46453e9
--- /dev/null
+++ b/src/assets/icons/ic-settings-exit-fullscreen.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-settings-fullscreen.svg b/src/assets/icons/ic-settings-fullscreen.svg
new file mode 100644
index 0000000..a13fcc8
--- /dev/null
+++ b/src/assets/icons/ic-settings-fullscreen.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-settings-mode-moon.svg b/src/assets/icons/ic-settings-mode-moon.svg
new file mode 100644
index 0000000..be81693
--- /dev/null
+++ b/src/assets/icons/ic-settings-mode-moon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic-settings-mode-sun.svg b/src/assets/icons/ic-settings-mode-sun.svg
new file mode 100644
index 0000000..aeaeeac
--- /dev/null
+++ b/src/assets/icons/ic-settings-mode-sun.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic-user.svg b/src/assets/icons/ic-user.svg
new file mode 100644
index 0000000..141aeba
--- /dev/null
+++ b/src/assets/icons/ic-user.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic-workbench.svg b/src/assets/icons/ic-workbench.svg
new file mode 100644
index 0000000..6ea1c6d
--- /dev/null
+++ b/src/assets/icons/ic-workbench.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic_blank.svg b/src/assets/icons/ic_blank.svg
new file mode 100644
index 0000000..d187ec2
--- /dev/null
+++ b/src/assets/icons/ic_blank.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic_chat.svg b/src/assets/icons/ic_chat.svg
new file mode 100644
index 0000000..d8b905c
--- /dev/null
+++ b/src/assets/icons/ic_chat.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_decline.svg b/src/assets/icons/ic_decline.svg
new file mode 100644
index 0000000..0931d38
--- /dev/null
+++ b/src/assets/icons/ic_decline.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/icons/ic_delivery.svg b/src/assets/icons/ic_delivery.svg
new file mode 100644
index 0000000..e0b077c
--- /dev/null
+++ b/src/assets/icons/ic_delivery.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_disabled.svg b/src/assets/icons/ic_disabled.svg
new file mode 100644
index 0000000..2164101
--- /dev/null
+++ b/src/assets/icons/ic_disabled.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic_external.svg b/src/assets/icons/ic_external.svg
new file mode 100644
index 0000000..d38340e
--- /dev/null
+++ b/src/assets/icons/ic_external.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic_file.svg b/src/assets/icons/ic_file.svg
new file mode 100644
index 0000000..f5295c2
--- /dev/null
+++ b/src/assets/icons/ic_file.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_ai.svg b/src/assets/icons/ic_file_ai.svg
new file mode 100644
index 0000000..4d8098a
--- /dev/null
+++ b/src/assets/icons/ic_file_ai.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_audio.svg b/src/assets/icons/ic_file_audio.svg
new file mode 100644
index 0000000..329f232
--- /dev/null
+++ b/src/assets/icons/ic_file_audio.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_excel.svg b/src/assets/icons/ic_file_excel.svg
new file mode 100644
index 0000000..cb80eb2
--- /dev/null
+++ b/src/assets/icons/ic_file_excel.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_img.svg b/src/assets/icons/ic_file_img.svg
new file mode 100644
index 0000000..a95194a
--- /dev/null
+++ b/src/assets/icons/ic_file_img.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_pdf.svg b/src/assets/icons/ic_file_pdf.svg
new file mode 100644
index 0000000..8ed54c9
--- /dev/null
+++ b/src/assets/icons/ic_file_pdf.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_ppt.svg b/src/assets/icons/ic_file_ppt.svg
new file mode 100644
index 0000000..f2d7f14
--- /dev/null
+++ b/src/assets/icons/ic_file_ppt.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_psd.svg b/src/assets/icons/ic_file_psd.svg
new file mode 100644
index 0000000..7ecbee0
--- /dev/null
+++ b/src/assets/icons/ic_file_psd.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_txt.svg b/src/assets/icons/ic_file_txt.svg
new file mode 100644
index 0000000..1d34c34
--- /dev/null
+++ b/src/assets/icons/ic_file_txt.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_video.svg b/src/assets/icons/ic_file_video.svg
new file mode 100644
index 0000000..fb6eca6
--- /dev/null
+++ b/src/assets/icons/ic_file_video.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_word.svg b/src/assets/icons/ic_file_word.svg
new file mode 100644
index 0000000..b112fe5
--- /dev/null
+++ b/src/assets/icons/ic_file_word.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_file_zip.svg b/src/assets/icons/ic_file_zip.svg
new file mode 100644
index 0000000..f34001e
--- /dev/null
+++ b/src/assets/icons/ic_file_zip.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_folder.svg b/src/assets/icons/ic_folder.svg
new file mode 100644
index 0000000..01f6671
--- /dev/null
+++ b/src/assets/icons/ic_folder.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/assets/icons/ic_label.svg b/src/assets/icons/ic_label.svg
new file mode 100644
index 0000000..933e635
--- /dev/null
+++ b/src/assets/icons/ic_label.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/ic_mail.svg b/src/assets/icons/ic_mail.svg
new file mode 100644
index 0000000..f9561c4
--- /dev/null
+++ b/src/assets/icons/ic_mail.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_order.svg b/src/assets/icons/ic_order.svg
new file mode 100644
index 0000000..cc8dbb7
--- /dev/null
+++ b/src/assets/icons/ic_order.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/icons/ic_rise.svg b/src/assets/icons/ic_rise.svg
new file mode 100644
index 0000000..9368912
--- /dev/null
+++ b/src/assets/icons/ic_rise.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/images/background/cyan-blur.png b/src/assets/images/background/cyan-blur.png
new file mode 100644
index 0000000..b5dbc95
Binary files /dev/null and b/src/assets/images/background/cyan-blur.png differ
diff --git a/src/assets/images/background/dashboard.png b/src/assets/images/background/dashboard.png
new file mode 100644
index 0000000..26a2e88
Binary files /dev/null and b/src/assets/images/background/dashboard.png differ
diff --git a/src/assets/images/background/overlay_2.jpg b/src/assets/images/background/overlay_2.jpg
new file mode 100644
index 0000000..119d428
Binary files /dev/null and b/src/assets/images/background/overlay_2.jpg differ
diff --git a/src/assets/images/background/red-blur.png b/src/assets/images/background/red-blur.png
new file mode 100644
index 0000000..a0df012
Binary files /dev/null and b/src/assets/images/background/red-blur.png differ
diff --git a/src/assets/images/characters/character_3.png b/src/assets/images/characters/character_3.png
new file mode 100644
index 0000000..2d639cc
Binary files /dev/null and b/src/assets/images/characters/character_3.png differ
diff --git a/src/assets/images/characters/character_4.png b/src/assets/images/characters/character_4.png
new file mode 100644
index 0000000..0ce49ff
Binary files /dev/null and b/src/assets/images/characters/character_4.png differ
diff --git a/src/assets/images/characters/character_5.png b/src/assets/images/characters/character_5.png
new file mode 100644
index 0000000..b8fbb44
Binary files /dev/null and b/src/assets/images/characters/character_5.png differ
diff --git a/src/assets/images/characters/character_6.png b/src/assets/images/characters/character_6.png
new file mode 100644
index 0000000..f59a844
Binary files /dev/null and b/src/assets/images/characters/character_6.png differ
diff --git a/src/assets/images/characters/character_8.png b/src/assets/images/characters/character_8.png
new file mode 100644
index 0000000..44f1708
Binary files /dev/null and b/src/assets/images/characters/character_8.png differ
diff --git a/src/assets/images/cover/cover_3.jpg b/src/assets/images/cover/cover_3.jpg
new file mode 100644
index 0000000..5b5701e
Binary files /dev/null and b/src/assets/images/cover/cover_3.jpg differ
diff --git a/src/assets/images/cover/cover_4.jpg b/src/assets/images/cover/cover_4.jpg
new file mode 100644
index 0000000..4f500f2
Binary files /dev/null and b/src/assets/images/cover/cover_4.jpg differ
diff --git a/src/assets/images/cover/profile-banner.png b/src/assets/images/cover/profile-banner.png
new file mode 100644
index 0000000..16cbfe9
Binary files /dev/null and b/src/assets/images/cover/profile-banner.png differ
diff --git a/src/assets/images/glass/ic_glass_bag.png b/src/assets/images/glass/ic_glass_bag.png
new file mode 100644
index 0000000..41cb3c5
Binary files /dev/null and b/src/assets/images/glass/ic_glass_bag.png differ
diff --git a/src/assets/images/glass/ic_glass_buy.png b/src/assets/images/glass/ic_glass_buy.png
new file mode 100644
index 0000000..065ffcd
Binary files /dev/null and b/src/assets/images/glass/ic_glass_buy.png differ
diff --git a/src/assets/images/glass/ic_glass_message.png b/src/assets/images/glass/ic_glass_message.png
new file mode 100644
index 0000000..10b6c95
Binary files /dev/null and b/src/assets/images/glass/ic_glass_message.png differ
diff --git a/src/assets/images/glass/ic_glass_users.png b/src/assets/images/glass/ic_glass_users.png
new file mode 100644
index 0000000..415f0c9
Binary files /dev/null and b/src/assets/images/glass/ic_glass_users.png differ
diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png
new file mode 100644
index 0000000..b0eeef4
Binary files /dev/null and b/src/assets/images/logo.png differ
diff --git a/src/components/animate/motion-container.tsx b/src/components/animate/motion-container.tsx
new file mode 100644
index 0000000..d408fcf
--- /dev/null
+++ b/src/components/animate/motion-container.tsx
@@ -0,0 +1,21 @@
+import { m, MotionProps } from 'framer-motion';
+
+import { varContainer } from './variants/container';
+
+interface Props extends MotionProps {
+ className?: string;
+}
+
+export default function MotionContainer({ children, className }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/animate/motion-lazy.tsx b/src/components/animate/motion-lazy.tsx
new file mode 100644
index 0000000..e28642f
--- /dev/null
+++ b/src/components/animate/motion-lazy.tsx
@@ -0,0 +1,15 @@
+import { LazyMotion, m, domMax } from 'framer-motion';
+
+type Props = {
+ children: React.ReactNode;
+};
+/**
+ * [Reduce bundle size by lazy-loading a subset of Motion's features](https://www.framer.com/motion/lazy-motion/)
+ */
+export function MotionLazy({ children }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/animate/motion-viewport.tsx b/src/components/animate/motion-viewport.tsx
new file mode 100644
index 0000000..6a79331
--- /dev/null
+++ b/src/components/animate/motion-viewport.tsx
@@ -0,0 +1,22 @@
+import { MotionProps, m } from 'framer-motion';
+
+import { varContainer } from './variants';
+
+interface Props extends MotionProps {
+ className?: string;
+}
+
+export default function MotionViewport({ children, className, ...other }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/animate/types.ts b/src/components/animate/types.ts
new file mode 100644
index 0000000..2b236c6
--- /dev/null
+++ b/src/components/animate/types.ts
@@ -0,0 +1,26 @@
+export type VariantsType = {
+ durationIn?: number;
+ durationOut?: number;
+ easeIn?: [];
+ easeOut?: [];
+ distance?: number;
+};
+
+export type TranHoverType = {
+ duration?: number;
+ ease?: [];
+};
+export type TranEnterType = {
+ durationIn?: number;
+ easeIn?: [];
+};
+export type TranExitType = {
+ durationOut?: number;
+ easeOut?: [];
+};
+
+export type BackgroundType = {
+ duration?: number;
+ ease?: [];
+ colors?: string[];
+};
diff --git a/src/components/animate/variants/action.ts b/src/components/animate/variants/action.ts
new file mode 100644
index 0000000..caee72a
--- /dev/null
+++ b/src/components/animate/variants/action.ts
@@ -0,0 +1,9 @@
+/**
+ * https://www.framer.com/motion/gestures/
+ * @param hover
+ * @param tap
+ */
+export const varHover = (hover = 1.09, tap = 0.97) => ({
+ hover: { scale: hover },
+ tap: { scale: tap },
+});
diff --git a/src/components/animate/variants/background.ts b/src/components/animate/variants/background.ts
new file mode 100644
index 0000000..9f2123c
--- /dev/null
+++ b/src/components/animate/variants/background.ts
@@ -0,0 +1,103 @@
+import { BackgroundType } from '../types';
+
+export const varBgColor = (props?: BackgroundType) => {
+ const colors = props?.colors || ['#19dcea', '#b22cff'];
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'linear';
+
+ return {
+ animate: {
+ background: colors,
+ transition: { duration, ease },
+ },
+ };
+};
+
+// ----------------------------------------------------------------------
+
+export const varBgKenburns = (props?: BackgroundType) => {
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'easeOut';
+
+ return {
+ top: {
+ animate: {
+ scale: [1, 1.25],
+ y: [0, -15],
+ transformOrigin: ['50% 16%', '50% top'],
+ transition: { duration, ease },
+ },
+ },
+ bottom: {
+ animate: {
+ scale: [1, 1.25],
+ y: [0, 15],
+ transformOrigin: ['50% 84%', '50% bottom'],
+ transition: { duration, ease },
+ },
+ },
+ left: {
+ animate: {
+ scale: [1, 1.25],
+ x: [0, 20],
+ y: [0, 15],
+ transformOrigin: ['16% 50%', '0% left'],
+ transition: { duration, ease },
+ },
+ },
+ right: {
+ animate: {
+ scale: [1, 1.25],
+ x: [0, -20],
+ y: [0, -15],
+ transformOrigin: ['84% 50%', '0% right'],
+ transition: { duration, ease },
+ },
+ },
+ };
+};
+
+// ----------------------------------------------------------------------
+
+export const varBgPan = (props?: BackgroundType) => {
+ const colors = props?.colors || ['#ee7752', '#e73c7e', '#23a6d5', '#23d5ab'];
+ const duration = props?.duration || 5;
+ const ease = props?.ease || 'linear';
+
+ const gradient = (deg: number) => `linear-gradient(${deg}deg, ${colors})`;
+
+ return {
+ top: {
+ animate: {
+ backgroundImage: [gradient(0), gradient(0)],
+ backgroundPosition: ['center 99%', 'center 1%'],
+ backgroundSize: ['100% 600%', '100% 600%'],
+ transition: { duration, ease },
+ },
+ },
+ right: {
+ animate: {
+ backgroundPosition: ['1% center', '99% center'],
+ backgroundImage: [gradient(270), gradient(270)],
+ backgroundSize: ['600% 100%', '600% 100%'],
+ transition: { duration, ease },
+ },
+ },
+ bottom: {
+ animate: {
+ backgroundImage: [gradient(0), gradient(0)],
+ backgroundPosition: ['center 1%', 'center 99%'],
+ backgroundSize: ['100% 600%', '100% 600%'],
+ transition: { duration, ease },
+ },
+ },
+ left: {
+ animate: {
+ backgroundPosition: ['99% center', '1% center'],
+ backgroundImage: [gradient(270), gradient(270)],
+ backgroundSize: ['600% 100%', '600% 100%'],
+ transition: { duration, ease },
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/bounce.ts b/src/components/animate/variants/bounce.ts
new file mode 100644
index 0000000..880bad4
--- /dev/null
+++ b/src/components/animate/variants/bounce.ts
@@ -0,0 +1,111 @@
+import { VariantsType } from '../types';
+
+import { varTranEnter, varTranExit } from './transition';
+
+export const varBounce = (props?: VariantsType) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: {},
+ animate: {
+ scale: [0.3, 1.1, 0.9, 1.03, 0.97, 1],
+ opacity: [0, 1, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: [0.9, 1.1, 0.3],
+ opacity: [1, 1, 0],
+ },
+ },
+ inUp: {
+ initial: {},
+ animate: {
+ y: [720, -24, 12, -4, 0],
+ scaleY: [4, 0.9, 0.95, 0.985, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: { ...varTranEnter({ durationIn, easeIn }) },
+ },
+ exit: {
+ y: [12, -24, 720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: {},
+ animate: {
+ y: [-720, 24, -12, 4, 0],
+ scaleY: [4, 0.9, 0.95, 0.985, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: [-12, 24, -720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: {},
+ animate: {
+ x: [-720, 24, -12, 4, 0],
+ scaleX: [3, 1, 0.98, 0.995, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: [0, 24, -720],
+ scaleX: [1, 0.9, 2],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: {},
+ animate: {
+ x: [720, -24, 12, -4, 0],
+ scaleX: [3, 1, 0.98, 0.995, 1],
+ opacity: [0, 1, 1, 1, 1],
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: [0, -24, 720],
+ scaleX: [1, 0.9, 2],
+ opacity: [1, 1, 0],
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ animate: { scale: [0.9, 1.1, 0.3], opacity: [1, 1, 0] },
+ },
+ outUp: {
+ animate: {
+ y: [-12, 24, -720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ },
+ },
+ outDown: {
+ animate: {
+ y: [12, -24, 720],
+ scaleY: [0.985, 0.9, 3],
+ opacity: [1, 1, 0],
+ },
+ },
+ outLeft: {
+ animate: { x: [0, 24, -720], scaleX: [1, 0.9, 2], opacity: [1, 1, 0] },
+ },
+ outRight: {
+ animate: { x: [0, -24, 720], scaleX: [1, 0.9, 2], opacity: [1, 1, 0] },
+ },
+ };
+};
diff --git a/src/components/animate/variants/container.ts b/src/components/animate/variants/container.ts
new file mode 100644
index 0000000..1ff849c
--- /dev/null
+++ b/src/components/animate/variants/container.ts
@@ -0,0 +1,26 @@
+export type Props = {
+ staggerIn?: number;
+ delayIn?: number;
+ staggerOut?: number;
+};
+
+export const varContainer = (props?: Props) => {
+ const staggerIn = props?.staggerIn || 0.05;
+ const delayIn = props?.staggerIn || 0.05;
+ const staggerOut = props?.staggerIn || 0.05;
+
+ return {
+ animate: {
+ transition: {
+ staggerChildren: staggerIn,
+ delayChildren: delayIn,
+ },
+ },
+ exit: {
+ transition: {
+ staggerChildren: staggerOut,
+ staggerDirection: -1,
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/fade.ts b/src/components/animate/variants/fade.ts
new file mode 100644
index 0000000..decd7f2
--- /dev/null
+++ b/src/components/animate/variants/fade.ts
@@ -0,0 +1,134 @@
+import { VariantsType } from '../types';
+
+//
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varFade = (props?: VariantsType) => {
+ const distance = props?.distance || 120;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { opacity: 0 },
+ animate: { opacity: 1, transition: varTranEnter },
+ exit: { opacity: 0, transition: varTranExit },
+ },
+ inUp: {
+ initial: { y: distance, opacity: 0 },
+ animate: {
+ y: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: { y: -distance, opacity: 0 },
+ animate: {
+ y: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: -distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: { x: -distance, opacity: 0 },
+ animate: {
+ x: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: -distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: { x: distance, opacity: 0 },
+ animate: {
+ x: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: distance,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { opacity: 1 },
+ animate: { opacity: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { opacity: 1, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outUp: {
+ initial: { y: 0, opacity: 1 },
+ animate: {
+ y: -distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outDown: {
+ initial: { y: 0, opacity: 1 },
+ animate: {
+ y: distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ y: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outLeft: {
+ initial: { x: 0, opacity: 1 },
+ animate: {
+ x: -distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outRight: {
+ initial: { x: 0, opacity: 1 },
+ animate: {
+ x: distance,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ x: 0,
+ opacity: 1,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/flip.ts b/src/components/animate/variants/flip.ts
new file mode 100644
index 0000000..98fc35d
--- /dev/null
+++ b/src/components/animate/variants/flip.ts
@@ -0,0 +1,61 @@
+import { VariantsType } from '../types';
+
+//
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varFlip = (props?: VariantsType) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inX: {
+ initial: { rotateX: -180, opacity: 0 },
+ animate: {
+ rotateX: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ rotateX: -180,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inY: {
+ initial: { rotateY: -180, opacity: 0 },
+ animate: {
+ rotateY: 0,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ rotateY: -180,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ outX: {
+ initial: { rotateX: 0, opacity: 1 },
+ animate: {
+ rotateX: 70,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ outY: {
+ initial: { rotateY: 0, opacity: 1 },
+ animate: {
+ rotateY: 70,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/index.ts b/src/components/animate/variants/index.ts
new file mode 100644
index 0000000..b3994f8
--- /dev/null
+++ b/src/components/animate/variants/index.ts
@@ -0,0 +1,98 @@
+import { varBgKenburns, varBgPan, varBgColor } from './background';
+import { varBounce } from './bounce';
+import { varFade } from './fade';
+import { varFlip } from './flip';
+import { varRotate } from './rotate';
+import { varScale } from './scale';
+import { varSlide } from './slide';
+import { varZoom } from './zoom';
+
+export * from './action';
+export * from './background';
+export * from './bounce';
+export * from './container';
+export * from './fade';
+export * from './flip';
+export * from './path';
+export * from './rotate';
+export * from './scale';
+export * from './slide';
+export * from './transition';
+export * from './zoom';
+
+export function getVariant(variant = 'slideInUp') {
+ return {
+ // Slide
+ slideInUp: varSlide().inUp,
+ slideInDown: varSlide().inDown,
+ slideInLeft: varSlide().inLeft,
+ slideInRight: varSlide().inRight,
+ slideOutUp: varSlide().outUp,
+ slideOutDown: varSlide().outDown,
+ slideOutLeft: varSlide().outLeft,
+ slideOutRight: varSlide().outRight,
+ // Fade
+ fadeIn: varFade().in,
+ fadeInUp: varFade().inUp,
+ fadeInDown: varFade().inDown,
+ fadeInLeft: varFade().inLeft,
+ fadeInRight: varFade().inRight,
+ fadeOut: varFade().out,
+ fadeOutUp: varFade().outUp,
+ fadeOutDown: varFade().outDown,
+ fadeOutLeft: varFade().outLeft,
+ fadeOutRight: varFade().outRight,
+ // Zoom
+ zoomIn: varZoom({ distance: 80 }).in,
+ zoomInUp: varZoom({ distance: 80 }).inUp,
+ zoomInDown: varZoom({ distance: 80 }).inDown,
+ zoomInLeft: varZoom({ distance: 240 }).inLeft,
+ zoomInRight: varZoom({ distance: 240 }).inRight,
+ zoomOut: varZoom().out,
+ zoomOutLeft: varZoom().outLeft,
+ zoomOutRight: varZoom().outRight,
+ zoomOutUp: varZoom().outUp,
+ zoomOutDown: varZoom().outDown,
+ // Bounce
+ bounceIn: varBounce().in,
+ bounceInUp: varBounce().inUp,
+ bounceInDown: varBounce().inDown,
+ bounceInLeft: varBounce().inLeft,
+ bounceInRight: varBounce().inRight,
+ bounceOut: varBounce().out,
+ bounceOutUp: varBounce().outUp,
+ bounceOutDown: varBounce().outDown,
+ bounceOutLeft: varBounce().outLeft,
+ bounceOutRight: varBounce().outRight,
+ // Flip
+ flipInX: varFlip().inX,
+ flipInY: varFlip().inY,
+ flipOutX: varFlip().outX,
+ flipOutY: varFlip().outY,
+ // Scale
+ scaleInX: varScale().inX,
+ scaleInY: varScale().inY,
+ scaleOutX: varScale().outX,
+ scaleOutY: varScale().outY,
+ // Rotate
+ rotateIn: varRotate().in,
+ rotateOut: varRotate().out,
+ // Background
+ kenburnsTop: varBgKenburns().top,
+ kenburnsBottom: varBgKenburns().bottom,
+ kenburnsLeft: varBgKenburns().left,
+ kenburnsRight: varBgKenburns().right,
+ panTop: varBgPan().top,
+ panBottom: varBgPan().bottom,
+ panLeft: varBgPan().left,
+ panRight: varBgPan().right,
+ color2x: varBgColor(),
+ color3x: varBgColor({ colors: ['#19dcea', '#b22cff', '#ea2222'] }),
+ color4x: varBgColor({
+ colors: ['#19dcea', '#b22cff', '#ea2222', '#f5be10'],
+ }),
+ color5x: varBgColor({
+ colors: ['#19dcea', '#b22cff', '#ea2222', '#f5be10', '#3bd80d'],
+ }),
+ }[variant];
+}
diff --git a/src/components/animate/variants/path.ts b/src/components/animate/variants/path.ts
new file mode 100644
index 0000000..a4bee2c
--- /dev/null
+++ b/src/components/animate/variants/path.ts
@@ -0,0 +1,14 @@
+// ----------------------------------------------------------------------
+
+export const TRANSITION = {
+ duration: 2,
+ ease: [0.43, 0.13, 0.23, 0.96],
+};
+
+export const varPath = {
+ animate: {
+ fillOpacity: [0, 0, 1],
+ pathLength: [1, 0.4, 0],
+ transition: TRANSITION,
+ },
+};
diff --git a/src/components/animate/variants/rotate.ts b/src/components/animate/variants/rotate.ts
new file mode 100644
index 0000000..0b3fdfb
--- /dev/null
+++ b/src/components/animate/variants/rotate.ts
@@ -0,0 +1,40 @@
+import { VariantsType } from '../types';
+
+//
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varRotate = (props?: VariantsType) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { opacity: 0, rotate: -360 },
+ animate: {
+ opacity: 1,
+ rotate: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ opacity: 0,
+ rotate: -360,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { opacity: 1, rotate: 0 },
+ animate: {
+ opacity: 0,
+ rotate: -360,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/scale.ts b/src/components/animate/variants/scale.ts
new file mode 100644
index 0000000..abee403
--- /dev/null
+++ b/src/components/animate/variants/scale.ts
@@ -0,0 +1,60 @@
+import { VariantsType } from '../types';
+
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varScale = (props?: VariantsType) => {
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inX: {
+ initial: { scaleX: 0, opacity: 0 },
+ animate: {
+ scaleX: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scaleX: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inY: {
+ initial: { scaleY: 0, opacity: 0 },
+ animate: {
+ scaleY: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scaleY: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ outX: {
+ initial: { scaleX: 1, opacity: 1 },
+ animate: {
+ scaleX: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outY: {
+ initial: { scaleY: 1, opacity: 1 },
+ animate: {
+ scaleY: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ };
+};
diff --git a/src/components/animate/variants/slide.ts b/src/components/animate/variants/slide.ts
new file mode 100644
index 0000000..d9adacb
--- /dev/null
+++ b/src/components/animate/variants/slide.ts
@@ -0,0 +1,72 @@
+import { VariantsType } from '../types';
+
+//
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varSlide = (props?: VariantsType) => {
+ const distance = props?.distance || 160;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ inUp: {
+ initial: { y: distance },
+ animate: { y: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { y: distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inDown: {
+ initial: { y: -distance },
+ animate: { y: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { y: -distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inLeft: {
+ initial: { x: -distance },
+ animate: { x: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { x: -distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ inRight: {
+ initial: { x: distance },
+ animate: { x: 0, transition: varTranEnter({ durationIn, easeIn }) },
+ exit: { x: distance, transition: varTranExit({ durationOut, easeOut }) },
+ },
+
+ // OUT
+ outUp: {
+ initial: { y: 0 },
+ animate: {
+ y: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { y: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outDown: {
+ initial: { y: 0 },
+ animate: {
+ y: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { y: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outLeft: {
+ initial: { x: 0 },
+ animate: {
+ x: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { x: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ outRight: {
+ initial: { x: 0 },
+ animate: {
+ x: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: { x: 0, transition: varTranExit({ durationOut, easeOut }) },
+ },
+ };
+};
diff --git a/src/components/animate/variants/transition.ts b/src/components/animate/variants/transition.ts
new file mode 100644
index 0000000..7ed7081
--- /dev/null
+++ b/src/components/animate/variants/transition.ts
@@ -0,0 +1,25 @@
+import { TranHoverType, TranEnterType, TranExitType } from '../types';
+
+// https://www.framer.com/motion/transition/
+// A transition defines how values animate from one state to another.
+
+export const varTranHover = (props?: TranHoverType) => {
+ const duration = props?.duration || 0.32;
+ const ease = props?.ease || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
+
+export const varTranEnter = (props?: TranEnterType) => {
+ const duration = props?.durationIn || 0.64;
+ const ease = props?.easeIn || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
+
+export const varTranExit = (props?: TranExitType) => {
+ const duration = props?.durationOut || 0.48;
+ const ease = props?.easeOut || [0.43, 0.13, 0.23, 0.96];
+
+ return { duration, ease };
+};
diff --git a/src/components/animate/variants/zoom.ts b/src/components/animate/variants/zoom.ts
new file mode 100644
index 0000000..86e078b
--- /dev/null
+++ b/src/components/animate/variants/zoom.ts
@@ -0,0 +1,137 @@
+import { VariantsType } from '../types';
+
+//
+import { varTranEnter, varTranExit } from './transition';
+
+// ----------------------------------------------------------------------
+
+export const varZoom = (props?: VariantsType) => {
+ const distance = props?.distance || 720;
+ const durationIn = props?.durationIn;
+ const durationOut = props?.durationOut;
+ const easeIn = props?.easeIn;
+ const easeOut = props?.easeOut;
+
+ return {
+ // IN
+ in: {
+ initial: { scale: 0, opacity: 0 },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inUp: {
+ initial: { scale: 0, opacity: 0, translateY: distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateY: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateY: distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inDown: {
+ initial: { scale: 0, opacity: 0, translateY: -distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateY: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateY: -distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inLeft: {
+ initial: { scale: 0, opacity: 0, translateX: -distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateX: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateX: -distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+ inRight: {
+ initial: { scale: 0, opacity: 0, translateX: distance },
+ animate: {
+ scale: 1,
+ opacity: 1,
+ translateX: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ exit: {
+ scale: 0,
+ opacity: 0,
+ translateX: distance,
+ transition: varTranExit({ durationOut, easeOut }),
+ },
+ },
+
+ // OUT
+ out: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outUp: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateY: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outDown: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateY: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outLeft: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateX: -distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ outRight: {
+ initial: { scale: 1, opacity: 1 },
+ animate: {
+ scale: 0,
+ opacity: 0,
+ translateX: distance,
+ transition: varTranEnter({ durationIn, easeIn }),
+ },
+ },
+ };
+};
diff --git a/src/components/card/index.tsx b/src/components/card/index.tsx
new file mode 100644
index 0000000..130267e
--- /dev/null
+++ b/src/components/card/index.tsx
@@ -0,0 +1,40 @@
+import { CSSProperties, ReactNode } from 'react';
+
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import { ThemeMode } from '#/enum';
+
+type Props = {
+ children?: ReactNode;
+ className?: string;
+ style?: CSSProperties;
+};
+export default function Card({ children, ...other }: Props) {
+ const { colorBgContainer } = useThemeToken();
+ const { themeMode } = useSettings();
+
+ const boxShadow: { [key in ThemeMode]: string } = {
+ light: 'rgba(145, 158, 171, 0.2) 0px 0px 2px 0px, rgba(145, 158, 171, 0.12) 0px 12px 24px -4px',
+ dark: 'rgba(0, 0, 0, 0.2) 0px 0px 2px 0px, rgba(0, 0, 0, 0.12) 0px 12px 24px -4px',
+ };
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/chart/chart.tsx b/src/components/chart/chart.tsx
new file mode 100644
index 0000000..c5fd5c6
--- /dev/null
+++ b/src/components/chart/chart.tsx
@@ -0,0 +1,21 @@
+import { memo } from 'react';
+import ApexChart from 'react-apexcharts';
+
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import { StyledApexChart } from './styles';
+
+import type { Props as ApexChartProps } from 'react-apexcharts';
+
+function Chart(props: ApexChartProps) {
+ const { themeMode } = useSettings();
+ const theme = useThemeToken();
+ return (
+
+
+
+ );
+}
+
+export default memo(Chart);
diff --git a/src/components/chart/styles.ts b/src/components/chart/styles.ts
new file mode 100644
index 0000000..b59cba1
--- /dev/null
+++ b/src/components/chart/styles.ts
@@ -0,0 +1,58 @@
+import { GlobalToken } from 'antd';
+import Color from 'color';
+import styled from 'styled-components';
+
+import { ThemeMode } from '#/enum';
+
+export const StyledApexChart = styled.div<{ $thememode: ThemeMode; $theme: GlobalToken }>`
+ .apexcharts-canvas {
+ /* TOOLTIP */
+ .apexcharts-tooltip {
+ color: ${(props) => props.$theme.colorText};
+ border-radius: 10px;
+ backdrop-filter: blur(6px);
+ background-color: ${(props) => Color(props.$theme.colorBgElevated).alpha(0.8).toString()};
+ box-shadow: ${(props) =>
+ props.$thememode === ThemeMode.Light
+ ? `rgba(145, 158, 171, 0.24) 0px 0px 2px 0px, rgba(145, 158, 171, 0.24) -20px 20px 40px -4px`
+ : `rgba(0, 0, 0, 0.24) 0px 0px 2px 0px, rgba(0, 0, 0, 0.24) -20px 20px 40px -4px;`};
+ .apexcharts-tooltip-title {
+ text-align: center;
+ font-weight: bold;
+ background-color: rgba(145, 158, 171, 0.08);
+ }
+ }
+
+ /* TOOLTIP X */
+ .apexcharts-xaxistooltip {
+ color: ${(props) => props.$theme.colorText};
+ border-radius: 10px;
+ backdrop-filter: blur(6px);
+ border-color: transparent;
+ box-shadow: ${(props) =>
+ props.$thememode === ThemeMode.Light
+ ? `rgba(145, 158, 171, 0.24) 0px 0px 2px 0px, rgba(145, 158, 171, 0.24) -20px 20px 40px -4px`
+ : `rgba(0, 0, 0, 0.24) 0px 0px 2px 0px, rgba(0, 0, 0, 0.24) -20px 20px 40px -4px;`};
+ background-color: ${(props) => Color(props.$theme.colorBgElevated).alpha(0.8).toString()};
+ &::before {
+ border-bottom-color: rgba(145, 158, 171, 0.24);
+ }
+ &::after {
+ border-bottom-color: rgba(255, 255, 255, 0.8);
+ }
+ }
+
+ /* LEGEND */
+ .apexcharts-legend {
+ padding: 0;
+ .apexcharts-legend-series {
+ display: inline-flex !important;
+ align-items: ecnter;
+ }
+ .apexcharts-legend-text {
+ line-height: 18px;
+ text-transform: capitalize;
+ }
+ }
+ }
+`;
diff --git a/src/components/chart/useChart.ts b/src/components/chart/useChart.ts
new file mode 100644
index 0000000..07d6367
--- /dev/null
+++ b/src/components/chart/useChart.ts
@@ -0,0 +1,206 @@
+import { ApexOptions } from 'apexcharts';
+import { mergeDeepRight } from 'ramda';
+
+import { useThemeToken } from '@/theme/hooks';
+
+export default function useChart(options: ApexOptions) {
+ const theme = useThemeToken();
+
+ const LABEL_TOTAL = {
+ show: true,
+ label: 'Total',
+ color: theme.colorTextSecondary,
+ fontSize: theme.fontSizeHeading2,
+ lineHeight: theme.lineHeightHeading2,
+ };
+
+ const LABEL_VALUE = {
+ offsetY: 8,
+ color: theme.colorText,
+ fontSize: theme.fontSizeHeading3,
+ lineHeight: theme.lineHeightHeading3,
+ };
+
+ const baseOptions = {
+ // Colors
+ colors: [
+ theme.colorPrimary,
+ theme.colorWarning,
+ theme.colorInfo,
+ theme.colorError,
+ theme.colorSuccess,
+ theme.colorWarningActive,
+ theme.colorSuccessActive,
+ theme.colorInfoActive,
+ theme.colorInfoText,
+ ],
+
+ // Chart
+ chart: {
+ toolbar: { show: false },
+ zoom: { enabled: false },
+ foreColor: theme.colorTextDisabled,
+ fontFamily: theme.fontFamily,
+ },
+
+ // States
+ states: {
+ hover: {
+ filter: {
+ type: 'lighten',
+ value: 0.04,
+ },
+ },
+ active: {
+ filter: {
+ type: 'darken',
+ value: 0.88,
+ },
+ },
+ },
+
+ // Fill
+ fill: {
+ opacity: 1,
+ gradient: {
+ type: 'vertical',
+ shadeIntensity: 0,
+ opacityFrom: 0.4,
+ opacityTo: 0,
+ stops: [0, 100],
+ },
+ },
+
+ // Datalabels
+ dataLabels: {
+ enabled: false,
+ },
+
+ // Stroke
+ stroke: {
+ width: 3,
+ curve: 'smooth',
+ lineCap: 'round',
+ },
+
+ // Grid
+ grid: {
+ strokeDashArray: 3,
+ borderColor: theme.colorSplit,
+ xaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ },
+
+ // Xaxis
+ xaxis: {
+ axisBorder: { show: false },
+ axisTicks: { show: false },
+ },
+
+ // Markers
+ markers: {
+ size: 0,
+ },
+
+ // Tooltip
+ tooltip: {
+ theme: false,
+ x: {
+ show: true,
+ },
+ },
+
+ // Legend
+ legend: {
+ show: true,
+ fontSize: 13,
+ position: 'top',
+ horizontalAlign: 'right',
+ markers: {
+ radius: 12,
+ },
+ fontWeight: 500,
+ itemMargin: {
+ horizontal: 8,
+ },
+ labels: {
+ colors: theme.colorText,
+ },
+ },
+
+ // plotOptions
+ plotOptions: {
+ // Bar
+ bar: {
+ borderRadius: 4,
+ columnWidth: '28%',
+ borderRadiusApplication: 'end',
+ borderRadiusWhenStacked: 'last',
+ },
+
+ // Pie + Donut
+ pie: {
+ donut: {
+ labels: {
+ show: true,
+ value: LABEL_VALUE,
+ total: LABEL_TOTAL,
+ },
+ },
+ },
+
+ // Radialbar
+ radialBar: {
+ track: {
+ strokeWidth: '100%',
+ },
+ dataLabels: {
+ value: LABEL_VALUE,
+ total: LABEL_TOTAL,
+ },
+ },
+
+ // Radar
+ radar: {
+ polygons: {
+ fill: { colors: ['transparent'] },
+ strokeColors: theme.colorSplit,
+ connectorColors: theme.colorSplit,
+ },
+ },
+
+ // polarArea
+ polarArea: {
+ rings: {
+ strokeColor: theme.colorSplit,
+ },
+ spokes: {
+ connectorColors: theme.colorSplit,
+ },
+ },
+ },
+
+ // Responsive
+ responsive: [
+ {
+ // sm
+ breakpoint: theme.screenSM,
+ options: {
+ plotOptions: { bar: { columnWidth: '40%' } },
+ },
+ },
+ {
+ // md
+ breakpoint: theme.screenMD,
+ options: {
+ plotOptions: { bar: { columnWidth: '32%' } },
+ },
+ },
+ ],
+ };
+
+ return mergeDeepRight(baseOptions, options) as ApexOptions;
+}
diff --git a/src/components/editor/index.tsx b/src/components/editor/index.tsx
new file mode 100644
index 0000000..3e8f661
--- /dev/null
+++ b/src/components/editor/index.tsx
@@ -0,0 +1,40 @@
+/* eslint-disable import/order */
+import '@/utils/highlight';
+import ReactQuill, { ReactQuillProps } from 'react-quill';
+import Toolbar, { formats } from './toolbar';
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+import { StyledEditor } from './styles';
+
+interface Props extends ReactQuillProps {
+ sample?: boolean;
+}
+export default function Editor({ id = 'slash-quill', sample = false, ...other }: Props) {
+ const token = useThemeToken();
+ const { themeMode } = useSettings();
+ const modules = {
+ toolbar: {
+ container: `#${id}`,
+ },
+ history: {
+ delay: 500,
+ maxStack: 100,
+ userOnly: true,
+ },
+ syntax: true,
+ clipboard: {
+ matchVisual: false,
+ },
+ };
+ return (
+
+
+
+
+ );
+}
diff --git a/src/components/editor/styles.ts b/src/components/editor/styles.ts
new file mode 100644
index 0000000..6ee4191
--- /dev/null
+++ b/src/components/editor/styles.ts
@@ -0,0 +1,190 @@
+import { GlobalToken } from 'antd';
+import styled from 'styled-components';
+
+import { ThemeMode } from '#/enum';
+
+type KeyofToken = keyof GlobalToken;
+const getHeadingStyle = (level: 1 | 2 | 3 | 4 | 5, token: GlobalToken) => {
+ const fontSizeHeading: KeyofToken = `fontSizeHeading${level}`;
+ const lineHeightHeading: KeyofToken = `lineHeightHeading${level}`;
+
+ return {
+ margin: 0,
+ color: token.colorTextHeading,
+ fontWeight: 800,
+ fontSize: token[fontSizeHeading],
+ lineHeight: token[lineHeightHeading],
+ };
+};
+
+const StyledEditor = styled.div<{ $token: GlobalToken; $thememode: ThemeMode }>`
+ h1 {
+ ${(props) => getHeadingStyle(1, props.$token)};
+ }
+ h2 {
+ ${(props) => getHeadingStyle(2, props.$token)};
+ }
+ h3 {
+ ${(props) => getHeadingStyle(3, props.$token)};
+ }
+ h4 {
+ ${(props) => getHeadingStyle(4, props.$token)};
+ }
+ h5 {
+ ${(props) => getHeadingStyle(5, props.$token)};
+ }
+ img {
+ display: inline;
+ }
+ overflow: hidden;
+ position: relative;
+ border-radius: 8px;
+ border: 1px solid rgba(119, 145, 170, 0.2);
+ & .ql-container.ql-snow {
+ border: none;
+ line-height: 1.6;
+ font-weight: 400;
+ font-size: 0.875rem;
+ }
+ & .ql-editor {
+ min-height: 160px;
+ max-height: 640px;
+ background-color: rgba(145, 158, 171, 0.08);
+ &.ql-blank::before {
+ font-style: normal;
+ color: rgb(145, 158, 171);
+ }
+ & pre.ql-syntax {
+ border-radius: 8px;
+ line-height: 1.57143;
+ font-size: 0.875rem;
+ font-family: 'Public Sans', sans-serif;
+ font-weight: 400;
+ padding: 16px;
+ border-radius: 8px;
+ background-color: rgb(22, 28, 36);
+ }
+ }
+`;
+
+const StyledToolbar = styled.div<{ $token: GlobalToken; $thememode: ThemeMode }>`
+ & .ql-snow.ql-toolbar button:hover .ql-fill,
+ .ql-snow .ql-toolbar button:hover .ql-fill,
+ .ql-snow.ql-toolbar button:focus .ql-fill,
+ .ql-snow .ql-toolbar button:focus .ql-fill,
+ .ql-snow.ql-toolbar button.ql-active .ql-fill,
+ .ql-snow .ql-toolbar button.ql-active .ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+ .ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+ .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+ fill: ${(props) => props.$token.colorPrimary};
+ }
+ & .ql-snow.ql-toolbar button:hover,
+ .ql-snow .ql-toolbar button:hover,
+ .ql-snow.ql-toolbar button:focus,
+ .ql-snow .ql-toolbar button:focus,
+ .ql-snow.ql-toolbar button.ql-active,
+ .ql-snow .ql-toolbar button.ql-active,
+ .ql-snow.ql-toolbar .ql-picker-label:hover,
+ .ql-snow .ql-toolbar .ql-picker-label:hover,
+ .ql-snow.ql-toolbar .ql-picker-label.ql-active,
+ .ql-snow .ql-toolbar .ql-picker-label.ql-active,
+ .ql-snow.ql-toolbar .ql-picker-item:hover,
+ .ql-snow .ql-toolbar .ql-picker-item:hover,
+ .ql-snow.ql-toolbar .ql-picker-item.ql-selected,
+ .ql-snow .ql-toolbar .ql-picker-item.ql-selected {
+ color: ${(props) => props.$token.colorPrimary};
+ }
+
+ & .ql-snow.ql-toolbar button:hover .ql-stroke,
+ .ql-snow .ql-toolbar button:hover .ql-stroke,
+ .ql-snow.ql-toolbar button:focus .ql-stroke,
+ .ql-snow .ql-toolbar button:focus .ql-stroke,
+ .ql-snow.ql-toolbar button.ql-active .ql-stroke,
+ .ql-snow .ql-toolbar button.ql-active .ql-stroke,
+ .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,
+ .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,
+ .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+ .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+ .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,
+ .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,
+ .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+ .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+ .ql-snow.ql-toolbar button:hover .ql-stroke-miter,
+ .ql-snow .ql-toolbar button:hover .ql-stroke-miter,
+ .ql-snow.ql-toolbar button:focus .ql-stroke-miter,
+ .ql-snow .ql-toolbar button:focus .ql-stroke-miter,
+ .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,
+ .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,
+ .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+ .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+ .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+ .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+ .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+ .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+ .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,
+ .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
+ stroke: ${(props) => props.$token.colorPrimary};
+ }
+
+ & .ql-stroke {
+ stroke: ${(props) => props.$token.colorTextBase};
+ }
+ & .ql-fill,
+ .ql-stroke.ql-fill {
+ fill: ${(props) => props.$token.colorTextBase};
+ }
+
+ & .ql-toolbar.ql-snow {
+ border: none;
+ border-bottom: 1px solid rgba(119, 145, 170, 0.2);
+ // Button
+ & button {
+ padding: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 4px;
+ }
+ & button svg,
+ span svg {
+ width: 20px;
+ height: 20px;
+ }
+ & .ql-picker-label {
+ border-radius: 4px;
+ border-color: transparent !important;
+ background-color: ${(props) => props.$token.colorBgContainerDisabled};
+ color: ${(props) => props.$token.colorTextBase};
+ }
+ & .ql-picker-options {
+ margin-top: 4px;
+ border: none;
+ max-height: 200px;
+ overflow: auto;
+ border-radius: 8px;
+ color: ${(props) => props.$token.colorTextBase};
+ background-color: ${(props) => props.$token.colorBgContainer};
+ }
+ }
+`;
+export { StyledEditor, StyledToolbar };
diff --git a/src/components/editor/toolbar.tsx b/src/components/editor/toolbar.tsx
new file mode 100644
index 0000000..64a7140
--- /dev/null
+++ b/src/components/editor/toolbar.tsx
@@ -0,0 +1,109 @@
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import { StyledToolbar } from './styles';
+
+const HEADINGS = ['Heading 1', 'Heading 2', 'Heading 3', 'Heading 4', 'Heading 5', 'Heading 6'];
+
+export const formats = [
+ 'align',
+ 'background',
+ 'blockquote',
+ 'bold',
+ 'bullet',
+ 'code',
+ 'code-block',
+ 'color',
+ 'direction',
+ 'font',
+ 'formula',
+ 'header',
+ 'image',
+ 'indent',
+ 'italic',
+ 'link',
+ 'list',
+ 'script',
+ 'size',
+ 'strike',
+ 'table',
+ 'underline',
+ 'video',
+];
+
+type EditorToolbarProps = {
+ id: string;
+ isSimple?: boolean;
+};
+
+export default function Toolbar({ id, isSimple, ...other }: EditorToolbarProps) {
+ const token = useThemeToken();
+ const { themeMode } = useSettings();
+ return (
+
+
+
+
+ {HEADINGS.map((heading, index) => (
+
+ {heading}
+
+ ))}
+ Normal
+
+
+
+
+
+
+
+
+
+
+ {!isSimple && (
+
+
+
+
+ )}
+
+
+
+
+ {!isSimple && }
+ {!isSimple && }
+
+
+ {!isSimple && (
+
+
+
+
+ )}
+
+ {!isSimple && (
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {!isSimple && }
+
+
+
+
+ );
+}
diff --git a/src/components/icon/icon-button.tsx b/src/components/icon/icon-button.tsx
new file mode 100644
index 0000000..8cb7a24
--- /dev/null
+++ b/src/components/icon/icon-button.tsx
@@ -0,0 +1,19 @@
+import { ButtonProps } from 'antd';
+import { CSSProperties, ReactNode } from 'react';
+
+type Props = {
+ children: ReactNode;
+ className?: string;
+ style?: CSSProperties;
+} & ButtonProps;
+export default function IconButton({ children, className, style, onClick }: Props) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/components/icon/iconify-icon.tsx b/src/components/icon/iconify-icon.tsx
new file mode 100644
index 0000000..e6bc075
--- /dev/null
+++ b/src/components/icon/iconify-icon.tsx
@@ -0,0 +1,23 @@
+import { Icon } from '@iconify/react';
+import styled from 'styled-components';
+
+import type { IconProps } from '@iconify/react';
+
+interface Props extends IconProps {
+ size?: IconProps['width'];
+}
+export default function Iconify({ icon, size = '1em', className = '', ...other }: Props) {
+ return (
+
+
+
+ );
+}
+
+const StyledIconify = styled.div`
+ display: inline-flex;
+ vertical-align: middle;
+ svg {
+ display: inline-block;
+ }
+`;
diff --git a/src/components/icon/index.ts b/src/components/icon/index.ts
new file mode 100644
index 0000000..7738a5c
--- /dev/null
+++ b/src/components/icon/index.ts
@@ -0,0 +1,5 @@
+import IconButton from './icon-button';
+import Iconify from './iconify-icon';
+import SvgIcon from './svg-icon';
+
+export { Iconify, SvgIcon, IconButton };
diff --git a/src/components/icon/svg-icon.tsx b/src/components/icon/svg-icon.tsx
new file mode 100644
index 0000000..2b5cfbc
--- /dev/null
+++ b/src/components/icon/svg-icon.tsx
@@ -0,0 +1,38 @@
+import { CSSProperties } from 'react';
+
+interface SvgIconProps {
+ prefix?: string;
+ icon: string;
+ color?: string;
+ size?: string | number;
+ className?: string;
+ style?: CSSProperties;
+}
+
+export default function SvgIcon({
+ icon,
+ prefix = 'icon',
+ color = 'currentColor',
+ size = '1em',
+ className = '',
+ style = {},
+}: SvgIconProps) {
+ const symbolId = `#${prefix}-${icon}`;
+ const svgStyle: CSSProperties = {
+ verticalAlign: 'middle',
+ width: size,
+ height: size,
+ color,
+ ...style,
+ };
+ return (
+
+
+
+ );
+}
diff --git a/src/components/loading/circle-loading.tsx b/src/components/loading/circle-loading.tsx
new file mode 100644
index 0000000..a1dd839
--- /dev/null
+++ b/src/components/loading/circle-loading.tsx
@@ -0,0 +1,9 @@
+import { Spin } from 'antd';
+
+export function CircleLoading() {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/loading/index.tsx b/src/components/loading/index.tsx
new file mode 100644
index 0000000..e1d4954
--- /dev/null
+++ b/src/components/loading/index.tsx
@@ -0,0 +1,2 @@
+export * from './circle-loading';
+export * from './line-loading';
diff --git a/src/components/loading/line-loading.tsx b/src/components/loading/line-loading.tsx
new file mode 100644
index 0000000..9fb2310
--- /dev/null
+++ b/src/components/loading/line-loading.tsx
@@ -0,0 +1,41 @@
+import { Progress } from 'antd';
+import Color from 'color';
+import { useEffect, useState } from 'react';
+
+import { useThemeToken } from '@/theme/hooks';
+
+export function LineLoading() {
+ const { colorTextBase, colorBgContainerDisabled } = useThemeToken();
+ const [percent, setPercent] = useState(10);
+ const [increasing, setIncreasing] = useState(true);
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ if (increasing) {
+ setPercent((prevPercent) => prevPercent + 20);
+ if (percent === 100) {
+ setIncreasing(false);
+ }
+ } else {
+ setPercent(0);
+ setIncreasing(true);
+ }
+ }, 50);
+
+ return () => {
+ clearInterval(interval);
+ };
+ }, [percent, increasing]);
+
+ return (
+
+ );
+}
diff --git a/src/components/locale-picker/index.tsx b/src/components/locale-picker/index.tsx
new file mode 100644
index 0000000..725696b
--- /dev/null
+++ b/src/components/locale-picker/index.tsx
@@ -0,0 +1,37 @@
+import { Dropdown } from 'antd';
+
+import useLocale, { LANGUAGE_MAP } from '@/locales/useLocale';
+
+import { IconButton, SvgIcon } from '../icon';
+
+import { LocalEnum } from '#/enum';
+import type { MenuProps } from 'antd';
+
+type Locale = keyof typeof LocalEnum;
+
+/**
+ * Locale Picker
+ */
+export default function LocalePicker() {
+ const { setLocale, locale } = useLocale();
+
+ const localeList: MenuProps['items'] = Object.values(LANGUAGE_MAP).map((item) => {
+ return {
+ key: item.locale,
+ label: item.label,
+ icon: ,
+ };
+ });
+
+ return (
+ setLocale(e.key as Locale) }}
+ >
+
+
+
+
+ );
+}
diff --git a/src/components/logo/index.tsx b/src/components/logo/index.tsx
new file mode 100644
index 0000000..0ea266b
--- /dev/null
+++ b/src/components/logo/index.tsx
@@ -0,0 +1,20 @@
+import { NavLink } from 'react-router-dom';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import { Iconify } from '../icon';
+
+interface Props {
+ size?: number | string;
+}
+function Logo({ size = 50 }: Props) {
+ const { colorPrimary } = useThemeToken();
+
+ return (
+
+
+
+ );
+}
+
+export default Logo;
diff --git a/src/components/markdown/index.tsx b/src/components/markdown/index.tsx
new file mode 100644
index 0000000..4065458
--- /dev/null
+++ b/src/components/markdown/index.tsx
@@ -0,0 +1,28 @@
+import ReactMarkdown from 'react-markdown';
+import { ReactMarkdownOptions } from 'react-markdown/lib/react-markdown';
+// markdown plugins
+import rehypeHighlight from 'rehype-highlight';
+import rehypeRaw from 'rehype-raw';
+import remarkGfm from 'remark-gfm'; // add support for strikethrough, tables, tasklists and URLs directly
+
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+import '@/utils/highlight';
+
+import StyledMarkdown from './styles';
+
+type Props = ReactMarkdownOptions;
+export default function Markdown({ children }: Props) {
+ const token = useThemeToken();
+ const { themeMode } = useSettings();
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/src/components/markdown/styles.ts b/src/components/markdown/styles.ts
new file mode 100644
index 0000000..32e2505
--- /dev/null
+++ b/src/components/markdown/styles.ts
@@ -0,0 +1,166 @@
+import { GlobalToken } from 'antd';
+/**
+ * https://styled-components.com/
+ * vscode plugin: https://github.com/styled-components/vscode-styled-components
+ */
+import styled from 'styled-components';
+
+import { ThemeMode } from '#/enum';
+
+type KeyofToken = keyof GlobalToken;
+const getHeadingStyle = (level: 1 | 2 | 3 | 4 | 5, token: GlobalToken) => {
+ const fontSizeHeading: KeyofToken = `fontSizeHeading${level}`;
+ const lineHeightHeading: KeyofToken = `lineHeightHeading${level}`;
+
+ return {
+ margin: 0,
+ color: token.colorTextHeading,
+ fontWeight: 800,
+ fontSize: token[fontSizeHeading],
+ lineHeight: token[lineHeightHeading],
+ };
+};
+const StyledMarkdown = styled.div<{ $token: GlobalToken; $thememode: ThemeMode }>`
+ display: grid;
+ // Text
+ h1 {
+ ${(props) => getHeadingStyle(1, props.$token)};
+ }
+ h2 {
+ ${(props) => getHeadingStyle(2, props.$token)};
+ }
+ h3 {
+ ${(props) => getHeadingStyle(3, props.$token)};
+ }
+ h4 {
+ ${(props) => getHeadingStyle(4, props.$token)};
+ }
+ h5 {
+ ${(props) => getHeadingStyle(5, props.$token)};
+ }
+ a {
+ color: ${(props) => props.$token.colorPrimary};
+ }
+ img {
+ border-radius: 4px;
+ }
+ br {
+ display: grid;
+ content: '';
+ margin-top: 0.75em;
+ }
+
+ // Divider
+ hr {
+ margin: 0;
+ border-width: 1;
+ border-style: solid;
+ }
+
+ // List
+ ul,
+ ol {
+ margin: 0;
+ li {
+ line-height: 2;
+ display: flex;
+ align-items: center;
+ }
+ }
+
+ // Blockquote
+ blockquote {
+ line-height: 1.5;
+ font-size: 1.5em;
+ margin: 40px auto;
+ position: relative;
+ padding: 24px 24px 24px 64px;
+ border-radius: 16px;
+ background-color: #f4f6f8;
+ color: #637381;
+ p,
+ span {
+ margin-bottom: 0;
+ font-size: inherit;
+ font-family: inherit;
+ }
+ &::before {
+ left: 16px;
+ top: -8px;
+ display: block;
+ font-size: 3em;
+ position: absolute;
+ content: '“';
+ }
+ }
+
+ // Code Block
+ pre,
+ pre > code {
+ font-size: 16px;
+ overflow-x: auto;
+ white-space: pre;
+ border-radius: 8px;
+ }
+ code {
+ font-size: 14px;
+ border-radius: 4px;
+ white-space: pre;
+ padding: 0px;
+ background-color: ${(props) =>
+ props.$thememode === ThemeMode.Light ? '#161c24' : '#919eab29'};
+ }
+
+ // Table
+ table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 1px solid #919eab33;
+ th,
+ td {
+ padding: 8px;
+ border: 1px solid #919eab33;
+ }
+ tbody tr:nth-of-type(odd) {
+ background-color: ${(props) =>
+ props.$thememode === ThemeMode.Light ? '#f4f6f8' : '#919eab1f '};
+ }
+ }
+
+ // Checkbox
+ input {
+ margin-right: 10px;
+ &[type='checkbox'] {
+ position: relative;
+ cursor: pointer;
+ &::before {
+ content: '';
+ top: -2px;
+ left: -2px;
+ width: 17px;
+ height: 17px;
+ border-radius: 3px;
+ position: absolute;
+ background-color: #f4f6f8;
+ }
+ &:checked {
+ &::before {
+ background-color: ${(props) => props.$token.colorPrimary};
+ }
+ &::after {
+ content: '';
+ top: 1px;
+ left: 5px;
+ width: 4px;
+ height: 9px;
+ position: absolute;
+ transform: rotate(45deg);
+ border: solid white;
+ border-width: 0 2px 2px 0;
+ }
+ }
+ }
+ }
+`;
+
+export default StyledMarkdown;
diff --git a/src/components/progress-bar/index.tsx b/src/components/progress-bar/index.tsx
new file mode 100644
index 0000000..bb52e0c
--- /dev/null
+++ b/src/components/progress-bar/index.tsx
@@ -0,0 +1,58 @@
+import NProgress from 'nprogress';
+import 'nprogress/nprogress.css';
+import { useEffect, useState } from 'react';
+
+import { usePathname } from '@/router/hooks';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function ProgressBar() {
+ const pathname = usePathname();
+ const { colorPrimary } = useThemeToken();
+
+ const [mounted, setMounted] = useState(false);
+ const [visible, setVisible] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ useEffect(() => {
+ if (!visible) {
+ NProgress.configure({
+ showSpinner: false,
+ });
+ NProgress.start();
+ changeNprogressBar();
+ setVisible(true);
+ }
+
+ if (visible) {
+ NProgress.done();
+ setVisible(false);
+ }
+
+ if (!visible && mounted) {
+ setVisible(false);
+ NProgress.done();
+ }
+
+ return () => {
+ NProgress.done();
+ };
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [pathname, mounted]);
+
+ const changeNprogressBar = () => {
+ const nprogress = document.getElementById('nprogress');
+ if (nprogress) {
+ const bar: HTMLElement = nprogress.querySelector('.bar')!;
+ const peg: HTMLElement = nprogress.querySelector('.peg')!;
+
+ bar.style.background = colorPrimary;
+ bar.style.boxShadow = `0 0 2px ${colorPrimary}`;
+
+ peg.style.boxShadow = `0 0 10px ${colorPrimary}, 0 0 5px ${colorPrimary}`;
+ }
+ };
+ return null;
+}
diff --git a/src/components/scroll-progress/index.tsx b/src/components/scroll-progress/index.tsx
new file mode 100644
index 0000000..05f635d
--- /dev/null
+++ b/src/components/scroll-progress/index.tsx
@@ -0,0 +1,31 @@
+import { HTMLMotionProps, MotionValue, m, useSpring } from 'framer-motion';
+import { CSSProperties } from 'react';
+
+import { useThemeToken } from '@/theme/hooks';
+
+interface Props extends HTMLMotionProps<'div'> {
+ color?: string;
+ scrollYProgress: MotionValue;
+ height?: number;
+}
+/**
+ * https://www.framer.com/motion/scroll-animations/##spring-smoothing
+ */
+export default function ScrollProgress({ scrollYProgress, height = 4, color, ...other }: Props) {
+ const scaleX = useSpring(scrollYProgress, {
+ stiffness: 100,
+ damping: 30,
+ restDelta: 0.001,
+ });
+
+ const { colorPrimary } = useThemeToken();
+ const backgroundColor = color || colorPrimary;
+
+ const style: CSSProperties = {
+ transformOrigin: '0%',
+ height,
+ backgroundColor,
+ };
+
+ return ;
+}
diff --git a/src/components/scrollbar/index.tsx b/src/components/scrollbar/index.tsx
new file mode 100644
index 0000000..985f070
--- /dev/null
+++ b/src/components/scrollbar/index.tsx
@@ -0,0 +1,14 @@
+import { forwardRef, memo } from 'react';
+import SimpleBar, { type Props as SimplebarProps } from 'simplebar-react';
+/**
+ * https://www.npmjs.com/package/simplebar-react?activeTab=readme
+ */
+const Scrollbar = forwardRef(({ children, ...other }, ref) => {
+ return (
+
+ {children}
+
+ );
+});
+
+export default memo(Scrollbar);
diff --git a/src/components/upload/index.ts b/src/components/upload/index.ts
new file mode 100644
index 0000000..4956048
--- /dev/null
+++ b/src/components/upload/index.ts
@@ -0,0 +1,3 @@
+export * from './upload';
+export * from './upload-avatar';
+export * from './upload-box';
diff --git a/src/components/upload/styles.ts b/src/components/upload/styles.ts
new file mode 100644
index 0000000..3e17fe9
--- /dev/null
+++ b/src/components/upload/styles.ts
@@ -0,0 +1,28 @@
+import styled from 'styled-components';
+
+export const StyledUpload = styled.div<{ $thumbnail?: boolean }>`
+ .ant-upload {
+ border: none !important;
+ }
+ .ant-upload-list {
+ display: ${(props) => (props.$thumbnail ? 'flex' : 'block')};
+ flex-wrap: wrap;
+ }
+`;
+
+export const StyledUploadAvatar = styled.div`
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
+ .ant-upload,
+ .ant-upload-select {
+ border: none !important;
+ }
+`;
+
+export const StyledUploadBox = styled.div`
+ .ant-upload {
+ border: none !important;
+ }
+ .ant-upload-list {
+ display: none;
+ }
+`;
diff --git a/src/components/upload/upload-avatar.tsx b/src/components/upload/upload-avatar.tsx
new file mode 100644
index 0000000..af2acdc
--- /dev/null
+++ b/src/components/upload/upload-avatar.tsx
@@ -0,0 +1,84 @@
+import { Typography, Upload } from 'antd';
+import { UploadChangeParam, UploadFile, UploadProps } from 'antd/es/upload';
+import { useState } from 'react';
+
+import { fBytes } from '@/utils/format-number';
+
+import { Iconify } from '../icon';
+
+import { StyledUploadAvatar } from './styles';
+import { beforeAvatarUpload, getBlobUrl } from './utils';
+
+interface Props extends UploadProps {
+ defaultAvatar?: string;
+ helperText?: React.ReactElement | string;
+}
+export function UploadAvatar({ helperText, defaultAvatar = '', ...other }: Props) {
+ const [imageUrl, setImageUrl] = useState(defaultAvatar);
+
+ const [isHover, setIsHover] = useState(false);
+ const handelHover = (hover: boolean) => {
+ setIsHover(hover);
+ };
+
+ const handleChange: UploadProps['onChange'] = (info: UploadChangeParam) => {
+ if (info.file.status === 'uploading') {
+ return;
+ }
+ if (['done', 'error'].includes(info.file.status!)) {
+ // TODO: Get this url from response in real world.
+ setImageUrl(getBlobUrl(info.file.originFileObj!));
+ }
+ };
+
+ const renderPreview = ;
+
+ const renderPlaceholder = (
+
+ );
+
+ const renderContent = (
+ handelHover(true)}
+ onMouseLeave={() => handelHover(false)}
+ >
+ {imageUrl ? renderPreview : null}
+ {!imageUrl || isHover ? renderPlaceholder : null}
+
+ );
+
+ const defaultHelperText = (
+
+ Allowed *.jpeg, *.jpg, *.png, *.gif
+ max size of {fBytes(3145728)}
+
+ );
+ const renderHelpText = {helperText || defaultHelperText}
;
+
+ return (
+
+
+ {renderContent}
+
+ {renderHelpText}
+
+ );
+}
diff --git a/src/components/upload/upload-box.tsx b/src/components/upload/upload-box.tsx
new file mode 100644
index 0000000..10d54ca
--- /dev/null
+++ b/src/components/upload/upload-box.tsx
@@ -0,0 +1,26 @@
+import { UploadProps } from 'antd';
+import Dragger from 'antd/es/upload/Dragger';
+import { ReactElement } from 'react';
+
+import { Iconify } from '../icon';
+
+import { StyledUploadBox } from './styles';
+
+interface Props extends UploadProps {
+ placeholder?: ReactElement;
+}
+export function UploadBox({ placeholder, ...other }: Props) {
+ return (
+
+
+
+ {placeholder || (
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/components/upload/upload-illustration.tsx b/src/components/upload/upload-illustration.tsx
new file mode 100644
index 0000000..7204773
--- /dev/null
+++ b/src/components/upload/upload-illustration.tsx
@@ -0,0 +1,529 @@
+import { useThemeToken } from '@/theme/hooks';
+
+export default function UploadIllustration() {
+ const {
+ colorPrimary: PRIMARY_MAIN,
+ colorPrimaryActive: PRIMARY_DARK,
+ colorPrimaryTextActive: PRIMARY_DARKER,
+ } = useThemeToken();
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/upload/upload-list-item.tsx b/src/components/upload/upload-list-item.tsx
new file mode 100644
index 0000000..38b727f
--- /dev/null
+++ b/src/components/upload/upload-list-item.tsx
@@ -0,0 +1,88 @@
+import { Card, Tooltip, Typography, Image } from 'antd';
+import { ItemRender } from 'antd/es/upload/interface';
+import { m } from 'framer-motion';
+import { useEffect, useState } from 'react';
+
+import { varFade } from '@/components/animate/variants';
+import { Iconify, SvgIcon } from '@/components/icon';
+import { fBytes } from '@/utils/format-number';
+
+import { getBlobUrl, getFileFormat, getFileThumb } from './utils';
+
+type Props = {
+ file: Parameters['1'];
+ actions: Parameters['3'];
+ thumbnail?: boolean;
+};
+
+export default function UploadListItem({ file, actions, thumbnail = false }: Props) {
+ const { name, size } = file;
+ const thumb = getFileThumb(name);
+ const format = getFileFormat(name);
+ const [imgThumbUrl, setImgThumbUrl] = useState('');
+
+ useEffect(() => {
+ console.log(file, format, 'file2222');
+ if (['done', 'error'].includes(file.status!) && file.url) {
+ setImgThumbUrl(file.url);
+ } else if (['done', 'error'].includes(file.status!) && format === 'img') {
+ setImgThumbUrl(getBlobUrl(file.originFileObj!));
+ console.log(getBlobUrl(file.originFileObj!), 'getBlobUrl(file.originFileObj!)');
+ }
+ }, [file, format]);
+
+ const closeButton = (
+
+
+
+ );
+
+ const thumbList = (
+
+
+ {format === 'img' || format === 'webp' ? (
+
+ ) : (
+
+ )}
+
+ {closeButton}
+
+ );
+ const cardList = (
+
+ {format === 'img' || format === 'webp' ? (
+
+ ) : (
+
+ )}
+
+ {name}
+
+ {fBytes(size)}
+
+
+ {closeButton}
+
+ );
+ return (
+
+ {thumbnail ? thumbList : cardList}
+
+ );
+}
diff --git a/src/components/upload/upload.tsx b/src/components/upload/upload.tsx
new file mode 100644
index 0000000..38e9b72
--- /dev/null
+++ b/src/components/upload/upload.tsx
@@ -0,0 +1,48 @@
+import { Typography, Upload as AntdUpload } from 'antd';
+import { ItemRender } from 'antd/es/upload/interface';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import { StyledUpload } from './styles';
+import UploadListItem from './upload-list-item';
+
+import type { UploadProps } from 'antd';
+
+const { Dragger } = AntdUpload;
+const { Text, Title } = Typography;
+
+interface Props extends UploadProps {
+ thumbnail?: boolean;
+}
+
+const itemRender: (thumbnail: boolean) => ItemRender = (thumbnail) => {
+ return function temp() {
+ // eslint-disable-next-line prefer-rest-params
+ const [, file, , actions] = arguments;
+ return ;
+ };
+};
+export function Upload({ thumbnail = false, ...other }: Props) {
+ const { colorPrimary } = useThemeToken();
+ return (
+
+
+
+
{/* */}
+
+
+ Drop or Select file
+
+
+ Drop files here or click
+
+ browse
+
+ thorough your machine
+
+
+
+
+
+ );
+}
diff --git a/src/components/upload/utils.ts b/src/components/upload/utils.ts
new file mode 100644
index 0000000..31529f9
--- /dev/null
+++ b/src/components/upload/utils.ts
@@ -0,0 +1,139 @@
+import { message } from 'antd';
+import { RcFile } from 'antd/es/upload';
+
+// Define more types here
+const FORMAT_PDF = ['pdf'];
+const FORMAT_TEXT = ['txt'];
+const FORMAT_PHOTOSHOP = ['psd'];
+const FORMAT_WORD = ['doc', 'docx'];
+const FORMAT_EXCEL = ['xls', 'xlsx'];
+const FORMAT_ZIP = ['zip', 'rar', 'iso'];
+const FORMAT_ILLUSTRATOR = ['ai', 'esp'];
+const FORMAT_POWERPOINT = ['ppt', 'pptx'];
+const FORMAT_AUDIO = ['wav', 'aif', 'mp3', 'aac'];
+const FORMAT_IMG = ['jpg', 'jpeg', 'gif', 'bmp', 'png', 'svg'];
+const FORMAT_VIDEO = ['m4v', 'avi', 'mpg', 'mp4', 'webm'];
+
+/**
+ *
+ * @param fileName
+ */
+export function getFileFormat(fileName: string | undefined) {
+ let format;
+ switch (true) {
+ case FORMAT_PDF.includes(fileTypeByName(fileName)):
+ format = 'pdf';
+ break;
+ case FORMAT_TEXT.includes(fileTypeByName(fileName)):
+ format = 'txt';
+ break;
+ case FORMAT_PHOTOSHOP.includes(fileTypeByName(fileName)):
+ format = 'psd';
+ break;
+ case FORMAT_WORD.includes(fileTypeByName(fileName)):
+ format = 'word';
+ break;
+ case FORMAT_EXCEL.includes(fileTypeByName(fileName)):
+ format = 'excel';
+ break;
+ case FORMAT_ZIP.includes(fileTypeByName(fileName)):
+ format = 'zip';
+ break;
+ case FORMAT_ILLUSTRATOR.includes(fileTypeByName(fileName)):
+ format = 'ai';
+ break;
+ case FORMAT_POWERPOINT.includes(fileTypeByName(fileName)):
+ format = 'ppt';
+ break;
+ case FORMAT_AUDIO.includes(fileTypeByName(fileName)):
+ format = 'audio';
+ break;
+ case FORMAT_IMG.includes(fileTypeByName(fileName)):
+ format = 'img';
+ break;
+ case FORMAT_VIDEO.includes(fileTypeByName(fileName)):
+ format = 'video';
+ break;
+ default:
+ format = fileTypeByName(fileName);
+ }
+ return format;
+}
+
+/**
+ *
+ * @param fileName
+ */
+export function getFileThumb(fileName: string | undefined) {
+ let thumb;
+ const format = getFileFormat(fileName);
+ switch (format) {
+ case 'txt':
+ thumb = 'ic_file_txt';
+ break;
+ case 'zip':
+ thumb = 'ic_file_zip';
+ break;
+ case 'audio':
+ thumb = 'ic_file_audio';
+ break;
+ case 'video':
+ thumb = 'ic_file_video';
+ break;
+ case 'word':
+ thumb = 'ic_file_word';
+ break;
+ case 'excel':
+ thumb = 'ic_file_excel';
+ break;
+ case 'ppt':
+ thumb = 'ic_file_ppt';
+ break;
+ case 'pdf':
+ thumb = 'ic_file_pdf';
+ break;
+ case 'psd':
+ thumb = 'ic_file_psd';
+ break;
+ case 'ai':
+ thumb = 'ic_file_ai';
+ break;
+ case 'img':
+ thumb = 'ic_file_img';
+ break;
+ case 'folder':
+ thumb = 'ic_folder';
+ break;
+ default:
+ thumb = 'ic_file';
+ }
+ return thumb;
+}
+
+export function fileTypeByName(fileName = '') {
+ return (fileName && fileName.split('.').pop()) || 'folder';
+}
+
+export function beforeAvatarUpload(file: RcFile) {
+ const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
+ if (!isJpgOrPng) {
+ message.error('You can only upload JPG/PNG file!');
+ }
+ const isLt2M = file.size / 1024 / 1024 < 2;
+ if (!isLt2M) {
+ message.error('Image must smaller than 2MB!');
+ }
+ return isJpgOrPng && isLt2M;
+}
+
+export function getBase64(img: RcFile, callback: (url: string) => void) {
+ const reader = new FileReader();
+ reader.addEventListener('load', () => callback(reader.result as string));
+ reader.readAsDataURL(img);
+}
+
+export function getBlobUrl(imgFile: RcFile) {
+ const fileBlob = new Blob([imgFile]);
+ const thumbnailUrl = URL.createObjectURL(fileBlob);
+ return thumbnailUrl;
+}
diff --git a/src/hooks/event/use-copy-to-clipboard.ts b/src/hooks/event/use-copy-to-clipboard.ts
new file mode 100644
index 0000000..648052c
--- /dev/null
+++ b/src/hooks/event/use-copy-to-clipboard.ts
@@ -0,0 +1,41 @@
+import { App } from 'antd';
+import { useState } from 'react';
+
+// ----------------------------------------------------------------------
+
+type CopiedValue = string | null;
+
+type CopyFn = (text: string) => Promise;
+
+type ReturnType = {
+ copyFn: CopyFn;
+ copiedText: CopiedValue;
+};
+
+export function useCopyToClipboard(): ReturnType {
+ const [copiedText, setCopiedText] = useState(null);
+ const { notification } = App.useApp();
+
+ const copyFn: CopyFn = async (text) => {
+ if (!navigator?.clipboard) {
+ console.warn('Clipboard not supported');
+ return false;
+ }
+
+ // Try to save to clipboard then save it in the state if worked
+ try {
+ await navigator.clipboard.writeText(text);
+ setCopiedText(text);
+ notification.success({
+ message: 'Copied!',
+ });
+ return true;
+ } catch (error) {
+ console.warn('Copy failed', error);
+ setCopiedText(null);
+ return false;
+ }
+ };
+
+ return { copiedText, copyFn };
+}
diff --git a/src/hooks/useAWSUploadService.ts b/src/hooks/useAWSUploadService.ts
new file mode 100644
index 0000000..a66351a
--- /dev/null
+++ b/src/hooks/useAWSUploadService.ts
@@ -0,0 +1,64 @@
+import { CognitoIdentityClient } from '@aws-sdk/client-cognito-identity';
+import { S3Client, PutObjectCommand, ObjectCannedACL } from '@aws-sdk/client-s3';
+import { fromCognitoIdentityPool } from '@aws-sdk/credential-provider-cognito-identity';
+import { useCallback, useMemo } from 'react';
+
+export interface IUploadService {
+ bucket: string;
+ identityPoolId: string;
+}
+
+export function useAWSUploadService() {
+ const serviceForm = {
+ bucket: 'aelfscan-mainnet',
+ identityPoolId: 'ap-northeast-1:bf43d3d0-4590-4a18-b9ed-8d6a4fb240ed',
+ };
+ const REGION = 'ap-northeast-1';
+
+ const s3Client = useMemo(
+ () =>
+ new S3Client({
+ region: REGION,
+ credentials: fromCognitoIdentityPool({
+ client: new CognitoIdentityClient({
+ region: REGION,
+ }),
+ identityPoolId: serviceForm.identityPoolId,
+ }),
+ }),
+ [serviceForm.identityPoolId],
+ );
+
+ const awsUploadFile = useCallback(
+ async (file: File) => {
+ const FileKey = `${Date.now()}-${file.name}`;
+ const params = {
+ ACL: ObjectCannedACL.public_read,
+ Bucket: serviceForm.bucket,
+ Key: FileKey,
+ };
+ try {
+ const res = await s3Client.send(
+ new PutObjectCommand({
+ Body: file,
+ ContentType: file.type,
+ ContentLength: file.size,
+ ...params,
+ }),
+ );
+ console.log('=====uploadFile success:', res);
+ return `https://${serviceForm.bucket}.s3.${REGION}.amazonaws.com/${encodeURIComponent(
+ FileKey,
+ )}`;
+ } catch (error) {
+ console.error('=====awsUploadFile error:', error);
+ return Promise.reject(error);
+ }
+ },
+ [s3Client, serviceForm.bucket],
+ );
+
+ return {
+ awsUploadFile,
+ };
+}
diff --git a/src/layouts/_common/account-dropdown.tsx b/src/layouts/_common/account-dropdown.tsx
new file mode 100644
index 0000000..b06a9cd
--- /dev/null
+++ b/src/layouts/_common/account-dropdown.tsx
@@ -0,0 +1,79 @@
+import { Divider, MenuProps } from 'antd';
+import Dropdown, { DropdownProps } from 'antd/es/dropdown/dropdown';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { IconButton, Iconify } from '@/components/icon';
+import { useLoginStateContext } from '@/pages/sys/login/providers/LoginStateProvider';
+import { useRouter } from '@/router/hooks';
+import { useUserInfo, useUserActions } from '@/store/userStore';
+import { useThemeToken } from '@/theme/hooks';
+
+/**
+ * Account Dropdown
+ */
+export default function AccountDropdown() {
+ const { replace } = useRouter();
+ const { username, email } = useUserInfo();
+ const { clearUserInfoAndToken } = useUserActions();
+ const { backToLogin } = useLoginStateContext();
+ const { t } = useTranslation();
+ const logout = () => {
+ try {
+ // todo const logoutMutation = useMutation(userService.logout);
+ // todo logoutMutation.mutateAsync();
+ clearUserInfoAndToken();
+ backToLogin();
+ } catch (error) {
+ console.log(error);
+ } finally {
+ replace('/login');
+ }
+ };
+ const { colorBgElevated, borderRadiusLG, boxShadowSecondary, colorPrimaryText } = useThemeToken();
+
+ const contentStyle: React.CSSProperties = {
+ backgroundColor: colorBgElevated,
+ borderRadius: borderRadiusLG,
+ boxShadow: boxShadowSecondary,
+ };
+
+ const menuStyle: React.CSSProperties = {
+ boxShadow: 'none',
+ };
+
+ const dropdownRender: DropdownProps['dropdownRender'] = (menu) => (
+
+
+
+ {React.cloneElement(menu as React.ReactElement, { style: menuStyle })}
+
+ );
+
+ const items: MenuProps['items'] = [
+ {
+ label: {t('sys.login.logout')} ,
+ key: '4',
+ onClick: logout,
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/layouts/_common/bread-crumb.tsx b/src/layouts/_common/bread-crumb.tsx
new file mode 100644
index 0000000..fa3c3b5
--- /dev/null
+++ b/src/layouts/_common/bread-crumb.tsx
@@ -0,0 +1,57 @@
+import { Breadcrumb } from 'antd';
+import { ItemType } from 'antd/es/breadcrumb/Breadcrumb';
+import { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useMatches, Link } from 'react-router-dom';
+
+import { Iconify } from '@/components/icon';
+import { useFlattenedRoutes, usePermissionRoutes } from '@/router/hooks';
+import { menuFilter } from '@/router/utils';
+
+import { AppRouteObject } from '#/router';
+
+export default function BreadCrumb() {
+ const { t } = useTranslation();
+ const matches = useMatches();
+ const [breadCrumbs, setBreadCrumbs] = useState([]);
+
+ const flattenedRoutes = useFlattenedRoutes();
+ const permissionRoutes = usePermissionRoutes();
+
+ useEffect(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ const paths = matches.filter((item) => item.pathname !== '/').map((item) => item.pathname);
+
+ const pathRouteMetas = flattenedRoutes.filter((item) => paths.indexOf(item.key) !== -1);
+
+ let items: AppRouteObject[] | undefined = [...menuRoutes];
+ const breadCrumbs = pathRouteMetas.map((routeMeta) => {
+ const { key, label } = routeMeta;
+ items = items!
+ .find((item) => item.meta?.key === key)
+ ?.children?.filter((item) => !item.meta?.hideMenu);
+ const result: ItemType = {
+ key,
+ title: t(label),
+ };
+ if (items) {
+ result.menu = {
+ items: items.map((item) => ({
+ key: item.meta?.key,
+ label: {t(item.meta!.label)},
+ })),
+ };
+ }
+ return result;
+ });
+ setBreadCrumbs(breadCrumbs);
+ }, [matches, flattenedRoutes, t, permissionRoutes]);
+
+ return (
+ }
+ />
+ );
+}
diff --git a/src/layouts/_common/header-simple.tsx b/src/layouts/_common/header-simple.tsx
new file mode 100644
index 0000000..ddeb67d
--- /dev/null
+++ b/src/layouts/_common/header-simple.tsx
@@ -0,0 +1,12 @@
+import Logo from '@/components/logo';
+
+import SettingButton from './setting-button';
+
+export default function HeaderSimple() {
+ return (
+
+ );
+}
diff --git a/src/layouts/_common/notice.tsx b/src/layouts/_common/notice.tsx
new file mode 100644
index 0000000..172f811
--- /dev/null
+++ b/src/layouts/_common/notice.tsx
@@ -0,0 +1,268 @@
+import { faker } from '@faker-js/faker';
+import { Badge, Button, Drawer, Space, Tabs, TabsProps } from 'antd';
+import Color from 'color';
+import { CSSProperties, ReactNode, useState } from 'react';
+
+import CyanBlur from '@/assets/images/background/cyan-blur.png';
+import RedBlur from '@/assets/images/background/red-blur.png';
+import { IconButton, Iconify, SvgIcon } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function NoticeButton() {
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const themeToken = useThemeToken();
+ const [count, setCount] = useState(4);
+
+ const style: CSSProperties = {
+ backdropFilter: 'blur(20px)',
+ backgroundImage: `url("${CyanBlur}"), url("${RedBlur}")`,
+ backgroundRepeat: 'no-repeat, no-repeat',
+ backgroundColor: Color(themeToken.colorBgContainer).alpha(0.9).toString(),
+ backgroundPosition: 'right top, left bottom',
+ backgroundSize: '50, 50%',
+ };
+
+ return (
+
+
setDrawerOpen(true)}>
+
+
+
+
+
setDrawerOpen(false)}
+ open={drawerOpen}
+ closable={false}
+ width={420}
+ styles={{
+ body: { padding: 0 },
+ mask: { backgroundColor: 'transparent' },
+ }}
+ style={style}
+ extra={
+ {
+ setCount(0);
+ setDrawerOpen(false);
+ }}
+ >
+
+
+ }
+ footer={
+
+ View All
+
+ }
+ >
+
+
+
+ );
+}
+
+function NoticeTab() {
+ const themeToken = useThemeToken();
+ const tabChildren: ReactNode = (
+
+
+
+
+
+ {faker.person.fullName()}
+ sent you a frind request
+
+
about 1 hour ago
+
+
+ Accept
+ Refuse
+
+
+
+
+
+
+
+
+
+ {faker.person.fullName()}
+ added file to
+ File Manager
+
+
5 hour ago
+
+
+ @{faker.person.fullName()}
+ {faker.lorem.lines(2)}
+
+
+
+
+ Reply
+
+
+
+
+
+
+
+
+
+ {faker.person.fullName()}
+ mentioned you in
+ aelfscan AD management background
+
+
1 days ago
+
+
+ Reply
+
+
+
+
+
+
+
+
+
+ {faker.person.fullName()}
+ added file to
+ File Manager
+
+
2 days ago
+
+
+
+ Witout Me
+ 1.2GB·30 min ago
+
+
Download
+
+
+
+
+
+
+
+
+ {faker.person.fullName()}
+ request a payment of
+ $3000
+
+
4 days ago
+
+
+ Pay
+ Refuse
+
+
+
+
+
+
+
+
+
+
+
+ Your order is placed waiting for shipping
+
+
4 days ago {' '}
+
+
+
+
+
+
+
+
+
+ You have new mail
+
+
5 days ago {' '}
+
+
+
+
+
+
+
+
+
+ You have new message 5 unread message
+
+
7 days ago
+
+
+
+
+
+
+
+
+
+ Delivery processing your order is being shipped
+
+
8 days ago {' '}
+
+
+
+ );
+ const items: TabsProps['items'] = [
+ {
+ key: '1',
+ label: (
+
+ ),
+ children: tabChildren,
+ },
+ {
+ key: '2',
+ label: (
+
+ ),
+ children: tabChildren,
+ },
+ {
+ key: '3',
+ label: (
+
+ ),
+ children: tabChildren,
+ },
+ ];
+ return (
+
+
+
+ );
+}
diff --git a/src/layouts/_common/search-bar.tsx b/src/layouts/_common/search-bar.tsx
new file mode 100644
index 0000000..796c126
--- /dev/null
+++ b/src/layouts/_common/search-bar.tsx
@@ -0,0 +1,255 @@
+import { Empty, GlobalToken, Input, InputRef, Modal } from 'antd';
+import match from 'autosuggest-highlight/match';
+import parse from 'autosuggest-highlight/parse';
+import Color from 'color';
+import { CSSProperties, useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useBoolean, useEvent, useKeyPressEvent } from 'react-use';
+import styled from 'styled-components';
+
+import { IconButton, SvgIcon } from '@/components/icon';
+import Scrollbar from '@/components/scrollbar';
+import { useFlattenedRoutes, useRouter } from '@/router/hooks';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function SearchBar() {
+ const { t } = useTranslation();
+ const { replace } = useRouter();
+ const inputRef = useRef(null);
+ const listRef = useRef(null);
+
+ const [search, toggle] = useBoolean(false);
+ const themeToken = useThemeToken();
+
+ const flattenedRoutes = useFlattenedRoutes();
+
+ const activeStyle: CSSProperties = {
+ border: `1px dashed ${themeToken.colorPrimary}`,
+ backgroundColor: `${Color(themeToken.colorPrimary).alpha(0.2).toString()}`,
+ };
+
+ const [searchQuery, setSearchQuery] = useState('');
+ const [searchResult, setSearchResult] = useState(flattenedRoutes);
+ const [selectedItemIndex, setSelectedItemIndex] = useState(0);
+
+ useEffect(() => {
+ const result = flattenedRoutes.filter(
+ (item) =>
+ t(item.label).toLowerCase().indexOf(searchQuery.toLowerCase()) !== -1 ||
+ item.key.toLowerCase().indexOf(searchQuery.toLowerCase()) !== -1,
+ );
+ setSearchResult(result);
+ setSelectedItemIndex(0);
+ }, [searchQuery, t, flattenedRoutes]);
+
+ const handleMetaK = (event: KeyboardEvent) => {
+ if (event.metaKey && event.key === 'k') {
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/metaKey
+ handleOpen();
+ }
+ };
+ useEvent('keydown', handleMetaK);
+
+ useKeyPressEvent('ArrowUp', (event) => {
+ if (!search) return;
+ event.preventDefault();
+ let nextIndex = selectedItemIndex - 1;
+ if (nextIndex < 0) {
+ nextIndex = searchResult.length - 1;
+ }
+ setSelectedItemIndex(nextIndex);
+ scrollSelectedItemIntoView(nextIndex);
+ });
+
+ useKeyPressEvent('ArrowDown', (event) => {
+ if (!search) return;
+ event.preventDefault();
+ let nextIndex = selectedItemIndex + 1;
+ if (nextIndex > searchResult.length - 1) {
+ nextIndex = 0;
+ }
+ setSelectedItemIndex(nextIndex);
+ scrollSelectedItemIntoView(nextIndex);
+ });
+
+ useKeyPressEvent('Enter', (event) => {
+ if (!search || searchResult.length === 0) return;
+ event.preventDefault();
+ const selectItem = searchResult[selectedItemIndex].key;
+ if (selectItem) {
+ handleSelect(selectItem);
+ toggle(false);
+ }
+ });
+
+ useKeyPressEvent('Escape', () => {
+ handleCancel();
+ });
+
+ const handleOpen = () => {
+ toggle(true);
+ setSearchQuery('');
+ setSelectedItemIndex(0);
+ };
+ const handleCancel = () => {
+ toggle(false);
+ };
+ const handleAfterOpenChange = (open: boolean) => {
+ if (open) {
+ // auto focus
+ inputRef.current?.focus();
+ }
+ };
+
+ const scrollSelectedItemIntoView = (index: number) => {
+ if (listRef.current) {
+ const selectedItem = listRef.current.children[index];
+ selectedItem.scrollIntoView({
+ behavior: 'smooth',
+ block: 'center',
+ });
+ }
+ };
+
+ const handleHover = (index: number) => {
+ if (index === selectedItemIndex) return;
+ setSelectedItemIndex(index);
+ };
+
+ const handleSelect = (key: string) => {
+ replace(key);
+ handleCancel();
+ };
+
+ return (
+ <>
+
+
+
+
+
+ {' '}
+ ⌘K{' '}
+
+
+
+
+ setSearchQuery(e.target.value)}
+ placeholder="Search..."
+ variant="borderless"
+ autoFocus
+ prefix={ }
+ suffix={
+
+ Esc
+
+ }
+ />
+ }
+ footer={
+
+
+
↑
+
↓
+
to navigate
+
+
+
+
+ }
+ >
+ {searchResult.length === 0 ? (
+
+ ) : (
+
+
+ {searchResult.map(({ key, label }, index) => {
+ const partsTitle = parse(t(label), match(t(label), searchQuery));
+ const partsKey = parse(key, match(key, searchQuery));
+ return (
+
handleSelect(key)}
+ onMouseMove={() => handleHover(index)}
+ >
+
+
+
+ {partsTitle.map((item) => (
+
+ {item.text}
+
+ ))}
+
+
+ {partsKey.map((item) => (
+
+ {item.text}
+
+ ))}
+
+
+
+
+ );
+ })}
+
+
+ )}
+
+ >
+ );
+}
+
+const StyledListItemButton = styled.div<{ $themetoken: GlobalToken }>`
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ width: 100%;
+ padding: 8px 16px;
+ border-radius: 8px;
+ border-bottom: ${(props) => `1px dashed ${props.$themetoken.colorBorder}`};
+ color: ${(props) => `${props.$themetoken.colorTextSecondary}`};
+`;
diff --git a/src/layouts/_common/setting-button.tsx b/src/layouts/_common/setting-button.tsx
new file mode 100644
index 0000000..7362da0
--- /dev/null
+++ b/src/layouts/_common/setting-button.tsx
@@ -0,0 +1,411 @@
+import {
+ CloseOutlined,
+ LeftOutlined,
+ QuestionCircleOutlined,
+ RightOutlined,
+} from '@ant-design/icons';
+import { Button, Card, Drawer, Switch, Tooltip } from 'antd';
+import Color from 'color';
+import { m } from 'framer-motion';
+import { CSSProperties, useState } from 'react';
+import { MdCircle } from 'react-icons/md';
+import screenfull from 'screenfull';
+
+import CyanBlur from '@/assets/images/background/cyan-blur.png';
+import RedBlur from '@/assets/images/background/red-blur.png';
+import { varHover } from '@/components/animate/variants/action';
+import { IconButton, SvgIcon } from '@/components/icon';
+import { useSettingActions, useSettings } from '@/store/settingStore';
+import { colorPrimarys } from '@/theme/antd/theme';
+import { useThemeToken } from '@/theme/hooks';
+
+import { ThemeColorPresets, ThemeLayout, ThemeMode } from '#/enum';
+
+/**
+ * App Setting
+ */
+export default function SettingButton() {
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const { colorPrimary, colorBgBase, colorTextSecondary, colorTextTertiary, colorBgContainer } =
+ useThemeToken();
+
+ const settings = useSettings();
+ const { themeMode, themeColorPresets, themeLayout, themeStretch, breadCrumb, multiTab } =
+ settings;
+ const { setSettings } = useSettingActions();
+
+ const setThemeMode = (themeMode: ThemeMode) => {
+ setSettings({
+ ...settings,
+ themeMode,
+ });
+ };
+
+ const setThemeColorPresets = (themeColorPresets: ThemeColorPresets) => {
+ setSettings({
+ ...settings,
+ themeColorPresets,
+ });
+ };
+
+ const setThemeLayout = (themeLayout: ThemeLayout) => {
+ setSettings({
+ ...settings,
+ themeLayout,
+ });
+ };
+
+ const setThemeStretch = (themeStretch: boolean) => {
+ setSettings({
+ ...settings,
+ themeStretch,
+ });
+ };
+
+ const setBreadCrumn = (checked: boolean) => {
+ setSettings({
+ ...settings,
+ breadCrumb: checked,
+ });
+ };
+
+ const setMultiTab = (checked: boolean) => {
+ setSettings({
+ ...settings,
+ multiTab: checked,
+ });
+ };
+
+ const style: CSSProperties = {
+ backdropFilter: 'blur(20px)',
+ backgroundImage: `url("${CyanBlur}"), url("${RedBlur}")`,
+ backgroundRepeat: 'no-repeat, no-repeat',
+ backgroundColor: Color(colorBgContainer).alpha(0.9).toString(),
+ backgroundPosition: 'right top, left bottom',
+ backgroundSize: '50, 50%',
+ };
+
+ const [isFullscreen, setIsFullscreen] = useState(screenfull.isFullscreen);
+ const toggleFullScreen = () => {
+ if (screenfull.isEnabled) {
+ screenfull.toggle();
+ setIsFullscreen(!isFullscreen);
+ }
+ };
+
+ const layoutBackground = (layout: ThemeLayout) =>
+ themeLayout === layout
+ ? `linear-gradient(135deg, ${colorBgBase} 0%, ${colorPrimary} 100%)`
+ : '#919eab';
+
+ return (
+ <>
+
+ setDrawerOpen(true)}
+ >
+
+
+
+
+
+ setDrawerOpen(false)}
+ open={drawerOpen}
+ closable={false}
+ width={280}
+ styles={{
+ body: { padding: 0 },
+ mask: { backgroundColor: 'transparent' },
+ }}
+ style={style}
+ extra={
+ setDrawerOpen(false)} className="h-9 w-9 hover:scale-105">
+
+
+ }
+ footer={
+
+
+ {isFullscreen ? (
+ <>
+
+ Exit FullScreen
+ >
+ ) : (
+ <>
+
+ FullScreen
+ >
+ )}
+
+
+ }
+ >
+
+ {/* theme mode */}
+
+
+ Mode
+
+
+ setThemeMode(ThemeMode.Light)}
+ className="flex h-20 w-full cursor-pointer items-center justify-center"
+ >
+
+
+ setThemeMode(ThemeMode.Dark)}
+ className="flex h-20 w-full cursor-pointer items-center justify-center"
+ >
+
+
+
+
+
+ {/* theme layout */}
+
+
+ Layout
+
+
+
setThemeLayout(ThemeLayout.Vertical)}
+ className="h-14 cursor-pointer"
+ style={{ flexGrow: 1, flexShrink: 0 }}
+ styles={{
+ body: {
+ padding: 0,
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ },
+ }}
+ >
+
+
+
+
setThemeLayout(ThemeLayout.Horizontal)}
+ className="h-14 cursor-pointer"
+ style={{ flexGrow: 1, flexShrink: 0 }}
+ styles={{
+ body: {
+ padding: 0,
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ },
+ }}
+ >
+
+
+
+
setThemeLayout(ThemeLayout.Mini)}
+ className="h-14 cursor-pointer"
+ style={{ flexGrow: 1, flexShrink: 0 }}
+ styles={{
+ body: {
+ padding: 0,
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ },
+ }}
+ >
+
+
+
+
+
+
+ {/* theme stretch */}
+
+
+ Stretch
+
+
+
+
+
+
setThemeStretch(!themeStretch)}
+ className="flex h-20 w-full cursor-pointer items-center justify-center"
+ styles={{
+ body: {
+ width: '50%',
+ padding: 0,
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ }}
+ >
+ {themeStretch ? (
+
+ ) : (
+
+ )}
+
+
+
+ {/* theme presets */}
+
+
+ Presets
+
+
+ {Object.entries(colorPrimarys).map(([preset, color]) => (
+
setThemeColorPresets(preset as ThemeColorPresets)}
+ >
+
+
+
+
+ ))}
+
+
+
+ {/* Page config */}
+
+
+ Page
+
+
+
+
BreadCrumb
+
setBreadCrumn(checked)}
+ />
+
+
+
Multi Tab
+
setMultiTab(checked)}
+ />
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/layouts/dashboard/config.ts b/src/layouts/dashboard/config.ts
new file mode 100644
index 0000000..8001413
--- /dev/null
+++ b/src/layouts/dashboard/config.ts
@@ -0,0 +1,8 @@
+export const NAV_WIDTH = 260;
+export const NAV_COLLAPSED_WIDTH = 90;
+export const NAV_HORIZONTAL_HEIGHT = 48;
+
+export const HEADER_HEIGHT = 80;
+export const OFFSET_HEADER_HEIGHT = 64;
+
+export const MULTI_TABS_HEIGHT = 32;
diff --git a/src/layouts/dashboard/header.tsx b/src/layouts/dashboard/header.tsx
new file mode 100644
index 0000000..2274300
--- /dev/null
+++ b/src/layouts/dashboard/header.tsx
@@ -0,0 +1,98 @@
+import { Drawer } from 'antd';
+import Color from 'color';
+import { CSSProperties, useState } from 'react';
+
+import { IconButton, SvgIcon } from '@/components/icon';
+import Logo from '@/components/logo';
+import { useSettings } from '@/store/settingStore';
+import { useResponsive, useThemeToken } from '@/theme/hooks';
+
+import AccountDropdown from '../_common/account-dropdown';
+import BreadCrumb from '../_common/bread-crumb';
+
+import { NAV_COLLAPSED_WIDTH, NAV_WIDTH, HEADER_HEIGHT, OFFSET_HEADER_HEIGHT } from './config';
+import Nav from './nav';
+
+import { ThemeLayout } from '#/enum';
+
+type Props = {
+ className?: string;
+ offsetTop?: boolean;
+};
+export default function Header({ className = '', offsetTop = false }: Props) {
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const { themeLayout, breadCrumb } = useSettings();
+ const { colorBgElevated, colorBorder } = useThemeToken();
+ const { screenMap } = useResponsive();
+
+ const headerStyle: CSSProperties = {
+ position: themeLayout === ThemeLayout.Horizontal ? 'relative' : 'fixed',
+ borderBottom:
+ themeLayout === ThemeLayout.Horizontal
+ ? `1px dashed ${Color(colorBorder).alpha(0.6).toString()}`
+ : '',
+ backgroundColor: Color(colorBgElevated).alpha(1).toString(),
+ };
+
+ if (themeLayout === ThemeLayout.Horizontal) {
+ headerStyle.width = '100vw';
+ } else if (screenMap.md) {
+ headerStyle.right = '0px';
+ headerStyle.left = 'auto';
+ headerStyle.width = `calc(100% - ${
+ themeLayout === ThemeLayout.Vertical ? NAV_WIDTH : NAV_COLLAPSED_WIDTH
+ }px)`;
+ } else {
+ headerStyle.width = '100vw';
+ }
+
+ return (
+ <>
+
+
+
+ {themeLayout !== ThemeLayout.Horizontal ? (
+
setDrawerOpen(true)} className="h-10 w-10 md:hidden">
+
+
+ ) : (
+
+ )}
+
{breadCrumb ? : null}
+
+
+
+ {/*
*/}
+ {/*
*/}
+ {/*
*/}
+
+
+
+
+ setDrawerOpen(false)}
+ open={drawerOpen}
+ closeIcon={false}
+ styles={{
+ header: {
+ display: 'none',
+ },
+ body: {
+ padding: 0,
+ overflow: 'hidden',
+ },
+ }}
+ width="auto"
+ >
+ setDrawerOpen(false)} />
+
+ >
+ );
+}
diff --git a/src/layouts/dashboard/index.tsx b/src/layouts/dashboard/index.tsx
new file mode 100644
index 0000000..9c0f4f4
--- /dev/null
+++ b/src/layouts/dashboard/index.tsx
@@ -0,0 +1,92 @@
+import { useScroll } from 'framer-motion';
+import { Suspense, useCallback, useEffect, useRef, useState } from 'react';
+import styled from 'styled-components';
+
+import { CircleLoading } from '@/components/loading';
+import ProgressBar from '@/components/progress-bar';
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import Header from './header';
+import Main from './main';
+import Nav from './nav';
+import NavHorizontal from './nav-horizontal';
+
+import { ThemeLayout, ThemeMode } from '#/enum';
+
+function DashboardLayout() {
+ const { colorBgElevated, colorTextBase } = useThemeToken();
+ const { themeLayout, themeMode } = useSettings();
+
+ const mainEl = useRef(null);
+ const { scrollY } = useScroll({ container: mainEl });
+ /**
+ * Whether the Y-axis is rolling
+ */
+ const [offsetTop, setOffsetTop] = useState(false);
+ const onOffSetTop = useCallback(() => {
+ scrollY.on('change', (scrollHeight) => {
+ if (scrollHeight > 0) {
+ setOffsetTop(true);
+ } else {
+ setOffsetTop(false);
+ }
+ });
+ }, [scrollY]);
+
+ useEffect(() => {
+ onOffSetTop();
+ }, [onOffSetTop]);
+
+ const navVertical = (
+
+
+
+ );
+
+ const nav = themeLayout === ThemeLayout.Horizontal ? : navVertical;
+
+ return (
+
+
+
+ }>
+
+ {nav}
+
+
+
+
+ );
+}
+export default DashboardLayout;
+
+const StyleWrapper = styled.div<{ $themeMode?: ThemeMode }>`
+ ::-webkit-scrollbar {
+ width: 8px;
+ }
+
+ ::-webkit-scrollbar-track {
+ border-radius: 8px;
+ background: ${(props) => (props.$themeMode === ThemeMode.Dark ? '#2c2c2c' : '#FAFAFA')};
+ }
+
+ ::-webkit-scrollbar-thumb {
+ border-radius: 10px;
+ background: ${(props) => (props.$themeMode === ThemeMode.Dark ? '#6b6b6b' : '#C1C1C1')};
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: ${(props) => (props.$themeMode === ThemeMode.Dark ? '#939393' : '##7D7D7D')};
+ }
+`;
diff --git a/src/layouts/dashboard/main.tsx b/src/layouts/dashboard/main.tsx
new file mode 100644
index 0000000..3e2e1c5
--- /dev/null
+++ b/src/layouts/dashboard/main.tsx
@@ -0,0 +1,56 @@
+import { Content } from 'antd/es/layout/layout';
+import { CSSProperties, forwardRef } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import { useSettings } from '@/store/settingStore';
+import { useResponsive } from '@/theme/hooks';
+
+import { NAV_WIDTH, NAV_COLLAPSED_WIDTH, HEADER_HEIGHT, MULTI_TABS_HEIGHT } from './config';
+import MultiTabs from './multi-tabs';
+import { MultiTabsProvider } from './multi-tabs/multi-tabs-provider';
+
+import { ThemeLayout } from '#/enum';
+
+type Props = {
+ offsetTop?: boolean;
+};
+const Main = forwardRef(({ offsetTop = false }, ref) => {
+ const { themeStretch, themeLayout, multiTab } = useSettings();
+ const { screenMap } = useResponsive();
+
+ const mainStyle: CSSProperties = {
+ paddingTop: HEADER_HEIGHT + (multiTab ? MULTI_TABS_HEIGHT : 0),
+ transition: 'padding 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
+ width: '100%',
+ };
+ if (themeLayout === ThemeLayout.Horizontal) {
+ mainStyle.width = '100vw';
+ mainStyle.paddingTop = multiTab ? MULTI_TABS_HEIGHT : 0;
+ } else if (screenMap.md) {
+ mainStyle.width = `calc(100% - ${
+ themeLayout === ThemeLayout.Vertical ? NAV_WIDTH : NAV_COLLAPSED_WIDTH
+ })`;
+ } else {
+ mainStyle.width = '100vw';
+ }
+
+ return (
+
+
+ {multiTab ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ );
+});
+
+export default Main;
diff --git a/src/layouts/dashboard/multi-tabs/index.tsx b/src/layouts/dashboard/multi-tabs/index.tsx
new file mode 100644
index 0000000..a283d50
--- /dev/null
+++ b/src/layouts/dashboard/multi-tabs/index.tsx
@@ -0,0 +1,452 @@
+import { Dropdown, MenuProps, Tabs, TabsProps } from 'antd';
+import Color from 'color';
+import { CSSProperties, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { DragDropContext, Draggable, Droppable, OnDragEndResponder } from 'react-beautiful-dnd';
+import { useTranslation } from 'react-i18next';
+import { useToggle, useFullscreen } from 'react-use';
+import styled from 'styled-components';
+
+import { USER_LIST } from '@/_mock/assets';
+import { Iconify } from '@/components/icon';
+import { useRouter } from '@/router/hooks';
+import { replaceDynamicParams } from '@/router/hooks/use-current-route-meta';
+import { useSettings } from '@/store/settingStore';
+import { useResponsive, useThemeToken } from '@/theme/hooks';
+
+import {
+ NAV_WIDTH,
+ NAV_COLLAPSED_WIDTH,
+ HEADER_HEIGHT,
+ OFFSET_HEADER_HEIGHT,
+ MULTI_TABS_HEIGHT,
+ NAV_HORIZONTAL_HEIGHT,
+} from '../config';
+
+import { useMultiTabsContext, type KeepAliveTab } from './multi-tabs-provider';
+
+import { MultiTabOperation, ThemeLayout } from '#/enum';
+
+type Props = {
+ offsetTop?: boolean;
+};
+export default function MultiTabs({ offsetTop = false }: Props) {
+ const { t } = useTranslation();
+ const { push } = useRouter();
+ const scrollContainer = useRef(null);
+ const [hoveringTabKey, setHoveringTabKey] = useState('');
+ const [openDropdownTabKey, setopenDropdownTabKey] = useState('');
+ const themeToken = useThemeToken();
+
+ const tabContentRef = useRef(null);
+ const [fullScreen, toggleFullScreen] = useToggle(false);
+ useFullscreen(tabContentRef, fullScreen, { onClose: () => toggleFullScreen(false) });
+
+ const {
+ tabs,
+ activeTabRoutePath,
+ setTabs,
+ closeTab,
+ refreshTab,
+ closeOthersTab,
+ closeAll,
+ closeLeft,
+ closeRight,
+ } = useMultiTabsContext();
+
+ /**
+ * Special Tab Label Render
+ *
+ * @example
+ * /user/:id --> `A-UserDetail`
+ */
+ const SpecialTabRenderMap: Record ReactNode> = useMemo(
+ () => ({
+ 'sys.menu.system.user_detail': (tab: KeepAliveTab) => {
+ const userId = tab.params?.id;
+ const defaultLabel = t(tab.label);
+ if (userId) {
+ const user = USER_LIST.find((item) => item.id === userId);
+ return `${user?.username}-${defaultLabel}`;
+ }
+ return defaultLabel;
+ },
+ }),
+ [t],
+ );
+
+ /**
+ * tab dropdown
+ */
+ const menuItems = useMemo(
+ () => [
+ {
+ label: t(`sys.tab.${MultiTabOperation.FULLSCREEN}`),
+ key: MultiTabOperation.FULLSCREEN,
+ icon: ,
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.REFRESH}`),
+ key: MultiTabOperation.REFRESH,
+ icon: ,
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.CLOSE}`),
+ key: MultiTabOperation.CLOSE,
+ icon: ,
+ disabled: tabs.length === 1,
+ },
+ {
+ type: 'divider',
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.CLOSELEFT}`),
+ key: MultiTabOperation.CLOSELEFT,
+ icon: (
+
+ ),
+ disabled: tabs.findIndex((tab) => tab.key === openDropdownTabKey) === 0,
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.CLOSERIGHT}`),
+ key: MultiTabOperation.CLOSERIGHT,
+ icon: ,
+ disabled: tabs.findIndex((tab) => tab.key === openDropdownTabKey) === tabs.length - 1,
+ },
+ {
+ type: 'divider',
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.CLOSEOTHERS}`),
+ key: MultiTabOperation.CLOSEOTHERS,
+ icon: ,
+ disabled: tabs.length === 1,
+ },
+ {
+ label: t(`sys.tab.${MultiTabOperation.CLOSEALL}`),
+ key: MultiTabOperation.CLOSEALL,
+ icon: ,
+ },
+ ],
+ [openDropdownTabKey, t, tabs],
+ );
+
+ /**
+ * tab dropdown click
+ */
+ const menuClick = useCallback(
+ (menuInfo: any, tab: KeepAliveTab) => {
+ const { key, domEvent } = menuInfo;
+ domEvent.stopPropagation();
+ switch (key) {
+ case MultiTabOperation.REFRESH:
+ refreshTab(tab.key);
+ break;
+ case MultiTabOperation.CLOSE:
+ closeTab(tab.key);
+ break;
+ case MultiTabOperation.CLOSEOTHERS:
+ closeOthersTab(tab.key);
+ break;
+ case MultiTabOperation.CLOSELEFT:
+ closeLeft(tab.key);
+ break;
+ case MultiTabOperation.CLOSERIGHT:
+ closeRight(tab.key);
+ break;
+ case MultiTabOperation.CLOSEALL:
+ closeAll();
+ break;
+ case MultiTabOperation.FULLSCREEN:
+ toggleFullScreen();
+ break;
+ default:
+ break;
+ }
+ },
+ [refreshTab, closeTab, closeOthersTab, closeLeft, closeRight, closeAll, toggleFullScreen],
+ );
+
+ /**
+ * Currently display the dorpdown tab
+ */
+ const onOpenChange = (open: boolean, tab: KeepAliveTab) => {
+ if (open) {
+ setopenDropdownTabKey(tab.key);
+ } else {
+ setopenDropdownTabKey('');
+ }
+ };
+
+ /**
+ * tab style
+ */
+ const calcTabStyle: (tab: KeepAliveTab) => CSSProperties = useCallback(
+ (tab) => {
+ const isActive = tab.key === activeTabRoutePath || tab.key === hoveringTabKey;
+ const result: CSSProperties = {
+ borderRadius: '8px 8px 0 0',
+ borderWidth: '1px',
+ borderStyle: 'solid',
+ borderColor: themeToken.colorBorderSecondary,
+ backgroundColor: themeToken.colorBgLayout,
+ transition:
+ 'color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, background 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
+ };
+
+ if (isActive) {
+ result.backgroundColor = themeToken.colorBgContainer;
+ result.color = themeToken.colorPrimaryText;
+ }
+ return result;
+ },
+ [activeTabRoutePath, hoveringTabKey, themeToken],
+ );
+
+ /**
+ * Render a single tab
+ */
+ const renderTabLabel = useCallback(
+ (tab: KeepAliveTab) => {
+ if (tab.hideTab) return null;
+ return (
+ menuClick(menuInfo, tab) }}
+ onOpenChange={(open) => onOpenChange(open, tab)}
+ >
+ {
+ if (tab.key === activeTabRoutePath) return;
+ setHoveringTabKey(tab.key);
+ }}
+ onMouseLeave={() => setHoveringTabKey('')}
+ >
+
+ {SpecialTabRenderMap[tab.label] ? SpecialTabRenderMap[tab.label](tab) : t(tab.label)}
+
+
{
+ e.stopPropagation();
+ closeTab(tab.key);
+ }}
+ style={{
+ visibility:
+ (tab.key !== activeTabRoutePath && tab.key !== hoveringTabKey) ||
+ tabs.length === 1
+ ? 'hidden'
+ : 'visible',
+ }}
+ />
+
+
+ );
+ },
+ [
+ t,
+ menuItems,
+ activeTabRoutePath,
+ hoveringTabKey,
+ tabs.length,
+ menuClick,
+ closeTab,
+ calcTabStyle,
+ SpecialTabRenderMap,
+ ],
+ );
+
+ /**
+ * all tab
+ */
+
+ const tabItems = useMemo(() => {
+ return tabs?.map((tab) => ({
+ label: renderTabLabel(tab),
+ key: tab.key,
+ closable: tabs.length > 1,
+ children: (
+
+ {tab.children}
+
+ ),
+ }));
+ }, [tabs, renderTabLabel]);
+
+ /**
+ *
+ */
+ const onDragEnd: OnDragEndResponder = ({ destination, source }) => {
+ // Drag to an illegal non-droppable area
+ if (!destination) {
+ return;
+ }
+ // Drop in place
+ if (destination.droppableId === source.droppableId && destination.index === source.index) {
+ return;
+ }
+
+ const newTabs = Array.from(tabs);
+ const [movedTab] = newTabs.splice(source.index, 1);
+ newTabs.splice(destination.index, 0, movedTab);
+ setTabs(newTabs);
+ };
+
+ /**
+ * render tabbar
+ */
+ const { themeLayout } = useSettings();
+ const { colorBorder, colorBgElevated } = useThemeToken();
+ const { screenMap } = useResponsive();
+
+ const multiTabsStyle: CSSProperties = {
+ position: 'fixed',
+ top: offsetTop ? OFFSET_HEADER_HEIGHT - 2 : HEADER_HEIGHT,
+ left: 0,
+ height: MULTI_TABS_HEIGHT,
+ backgroundColor: Color(colorBgElevated).alpha(1).toString(),
+ borderBottom: `1px dashed ${Color(colorBorder).alpha(0.6).toString()}`,
+ transition: 'top 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',
+ };
+
+ if (themeLayout === ThemeLayout.Horizontal) {
+ multiTabsStyle.top = HEADER_HEIGHT + NAV_HORIZONTAL_HEIGHT - 2;
+ } else if (screenMap.md) {
+ multiTabsStyle.right = '0px';
+ multiTabsStyle.left = 'auto';
+ multiTabsStyle.width = `calc(100% - ${
+ themeLayout === ThemeLayout.Vertical ? NAV_WIDTH : NAV_COLLAPSED_WIDTH
+ }px`;
+ } else {
+ multiTabsStyle.width = '100vw';
+ }
+
+ const handleTabClick = ({ key, params = {} }: KeepAliveTab) => {
+ const tabKey = replaceDynamicParams(key, params);
+ push(tabKey);
+ };
+
+ const renderTabBar: TabsProps['renderTabBar'] = () => {
+ return (
+
+
+
+ {(provided) => (
+
+
+ {tabs.map((tab, index) => (
+
handleTabClick(tab)}
+ >
+
+ {(provided) => (
+
+ {renderTabLabel(tab)}
+
+ )}
+
+
+ ))}
+
+ {provided.placeholder}
+
+ )}
+
+
+
+ );
+ };
+
+ /**
+ * When the route changes, scroll to the specified tab
+ */
+ useEffect(() => {
+ if (!scrollContainer || !scrollContainer.current) {
+ return;
+ }
+ const index = tabs.findIndex((tab) => tab.key === activeTabRoutePath);
+ const currentTabElement = scrollContainer.current.querySelector(`#tab-${index}`);
+ if (currentTabElement) {
+ currentTabElement.scrollIntoView({
+ block: 'nearest',
+ behavior: 'smooth',
+ });
+ }
+ }, [activeTabRoutePath, tabs]);
+
+ /**
+ * scrollContainer
+ */
+ useEffect(() => {
+ function handleMouseWheel(event: WheelEvent) {
+ event.preventDefault();
+ scrollContainer.current!.scrollLeft += event.deltaY;
+ }
+
+ scrollContainer.current!.addEventListener('mouseenter', () => {
+ scrollContainer.current!.addEventListener('wheel', handleMouseWheel);
+ });
+ scrollContainer.current!.addEventListener('mouseleave', () => {
+ scrollContainer.current!.removeEventListener('wheel', handleMouseWheel);
+ });
+ }, []);
+
+ return (
+
+
+
+ );
+}
+
+const StyledMultiTabs = styled.div`
+ height: 100%;
+ margin-top: 2px;
+ .anticon {
+ margin: 0px !important;
+ }
+ .ant-tabs {
+ height: 100%;
+ .ant-tabs-content {
+ height: 100%;
+ }
+ .ant-tabs-tabpane {
+ height: 100%;
+ & > div {
+ height: 100%;
+ }
+ }
+ }
+
+ .hide-scrollbar {
+ overflow: scroll;
+ flex-shrink: 0;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+ }
+
+ .hide-scrollbar::-webkit-scrollbar {
+ display: none;
+ }
+`;
diff --git a/src/layouts/dashboard/multi-tabs/multi-tabs-provider.tsx b/src/layouts/dashboard/multi-tabs/multi-tabs-provider.tsx
new file mode 100644
index 0000000..bbc938f
--- /dev/null
+++ b/src/layouts/dashboard/multi-tabs/multi-tabs-provider.tsx
@@ -0,0 +1,204 @@
+import { isEmpty } from 'ramda';
+import {
+ createContext,
+ PropsWithChildren,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useState,
+} from 'react';
+
+import { useCurrentRouteMeta, useRouter } from '@/router/hooks';
+import { replaceDynamicParams } from '@/router/hooks/use-current-route-meta';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import type { RouteMeta } from '#/router';
+
+export type KeepAliveTab = RouteMeta & {
+ children: any;
+};
+type MultiTabsContextType = {
+ tabs: KeepAliveTab[];
+ activeTabRoutePath?: string;
+ setTabs: (tabs: KeepAliveTab[]) => void;
+ closeTab: (path?: string) => void;
+ closeOthersTab: (path?: string) => void;
+ closeAll: () => void;
+ closeLeft: (path: string) => void;
+ closeRight: (path: string) => void;
+ refreshTab: (path: string) => void;
+};
+
+const MultiTabsContext = createContext({
+ tabs: [],
+ activeTabRoutePath: '',
+ setTabs: () => {},
+ closeTab: () => {},
+ closeOthersTab: () => {},
+ closeAll: () => {},
+ closeLeft: () => {},
+ closeRight: () => {},
+ refreshTab: () => {},
+});
+
+export function MultiTabsProvider({ children }: PropsWithChildren) {
+ const { push } = useRouter();
+ // tabs
+ const [tabs, setTabs] = useState([]);
+
+ // current route meta
+ const currentRouteMeta = useCurrentRouteMeta();
+ // active tab
+ const activeTabRoutePath = useMemo(() => {
+ if (!currentRouteMeta) return '';
+
+ const { key, params = {} } = currentRouteMeta;
+ if (!isEmpty(params)) {
+ return replaceDynamicParams(key, params);
+ }
+ return key;
+ }, [currentRouteMeta]);
+
+ /**
+ * Close specified tab
+ */
+ const closeTab = useCallback(
+ (path = activeTabRoutePath) => {
+ const tempTabs = [...tabs];
+ if (tempTabs.length === 1) return;
+
+ const deleteTabIndex = tempTabs.findIndex((item) => item.key === path);
+ if (deleteTabIndex === -1) return;
+
+ if (deleteTabIndex > 0) {
+ push(tempTabs[deleteTabIndex - 1].key);
+ } else {
+ push(tempTabs[deleteTabIndex + 1].key);
+ }
+
+ tempTabs.splice(deleteTabIndex, 1);
+ setTabs(tempTabs);
+ },
+ [activeTabRoutePath, push, tabs],
+ );
+
+ /**
+ * Close other tabs besides the specified tab
+ */
+ const closeOthersTab = useCallback(
+ (path = activeTabRoutePath) => {
+ setTabs((prev) => prev.filter((item) => item.key === path));
+ if (path !== activeTabRoutePath) {
+ push(path);
+ }
+ },
+ [activeTabRoutePath, push],
+ );
+
+ /**
+ * Close all tabs then navigate to the home page
+ */
+ const closeAll = useCallback(() => {
+ setTabs([]);
+ push(APP_HOMEPAGE);
+ }, [push]);
+
+ /**
+ * Close all tabs in the left of specified tab
+ */
+ const closeLeft = useCallback(
+ (path: string) => {
+ const currentTabIndex = tabs.findIndex((item) => item.key === path);
+ const newTabs = tabs.slice(currentTabIndex);
+ setTabs(newTabs);
+ push(path);
+ },
+ [push, tabs],
+ );
+
+ /**
+ * Close all tabs in the right of specified tab
+ */
+ const closeRight = useCallback(
+ (path: string) => {
+ const currentTabIndex = tabs.findIndex((item) => item.key === path);
+ const newTabs = tabs.slice(0, currentTabIndex + 1);
+ setTabs(newTabs);
+ push(path);
+ },
+ [push, tabs],
+ );
+
+ /**
+ * Refresh specified tab
+ */
+ const refreshTab = useCallback(
+ (path = activeTabRoutePath) => {
+ setTabs((prev) => {
+ const index = prev.findIndex((item) => item.key === path);
+
+ if (index >= 0) {
+ prev[index].timeStamp = getTimeStamp();
+ }
+
+ return [...prev];
+ });
+ },
+ [activeTabRoutePath],
+ );
+
+ useEffect(() => {
+ setTabs((prev) => prev.filter((item) => !item.hideTab));
+
+ if (!currentRouteMeta) return;
+ let { key } = currentRouteMeta;
+ const { outlet: children, params = {} } = currentRouteMeta;
+
+ if (!isEmpty(params)) {
+ key = replaceDynamicParams(key, params);
+ }
+ const isExisted = tabs.find((item) => item.key === key);
+
+ if (!isExisted) {
+ setTabs((prev) => [
+ ...prev,
+ { ...currentRouteMeta, key, children, timeStamp: getTimeStamp() },
+ ]);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [currentRouteMeta]);
+
+ const defaultValue: MultiTabsContextType = useMemo(
+ () => ({
+ tabs,
+ activeTabRoutePath,
+ setTabs,
+ closeTab,
+ closeOthersTab,
+ refreshTab,
+ closeAll,
+ closeLeft,
+ closeRight,
+ }),
+ [
+ activeTabRoutePath,
+ closeAll,
+ closeLeft,
+ closeOthersTab,
+ closeRight,
+ closeTab,
+ refreshTab,
+ tabs,
+ ],
+ );
+ return {children} ;
+}
+
+export function useMultiTabsContext() {
+ return useContext(MultiTabsContext);
+}
+
+function getTimeStamp() {
+ return new Date().getTime().toString();
+}
diff --git a/src/layouts/dashboard/nav-horizontal.tsx b/src/layouts/dashboard/nav-horizontal.tsx
new file mode 100644
index 0000000..c0929e8
--- /dev/null
+++ b/src/layouts/dashboard/nav-horizontal.tsx
@@ -0,0 +1,76 @@
+import { Menu, MenuProps } from 'antd';
+import { useState, useEffect, CSSProperties, useMemo } from 'react';
+import { useNavigate, useMatches, useLocation } from 'react-router-dom';
+
+import { useRouteToMenuFn, usePermissionRoutes, useFlattenedRoutes } from '@/router/hooks';
+import { menuFilter } from '@/router/utils';
+import { useThemeToken } from '@/theme/hooks';
+
+import { NAV_HORIZONTAL_HEIGHT } from './config';
+
+export default function NavHorizontal() {
+ const navigate = useNavigate();
+ const matches = useMatches();
+ const { pathname } = useLocation();
+
+ const { colorBgElevated } = useThemeToken();
+
+ const routeToMenuFn = useRouteToMenuFn();
+ const permissionRoutes = usePermissionRoutes();
+ const menuList = useMemo(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ return routeToMenuFn(menuRoutes);
+ }, [routeToMenuFn, permissionRoutes]);
+
+ // Get the routing menu after the pat is flattened
+ const flattenedRoutes = useFlattenedRoutes();
+
+ /**
+ * state
+ */
+ const [openKeys, setOpenKeys] = useState([]);
+ const [selectedKeys, setSelectedKeys] = useState(['']);
+
+ useEffect(() => {
+ setSelectedKeys([pathname]);
+ }, [pathname, matches]);
+
+ /**
+ * events
+ */
+ const onOpenChange: MenuProps['onOpenChange'] = (keys) => {
+ setOpenKeys(keys);
+ };
+ const onClick: MenuProps['onClick'] = ({ key }) => {
+ // Match the current click from the flattened routing information
+ const nextLink = flattenedRoutes?.find((el) => el.key === key);
+
+ // Handles special cases of external chains in menu items
+ // When you click the external chain, the route is not jumped, the tab is not added to the current project, the current route is not selected, and a new tab is opened to open the external chain
+ if (nextLink?.hideTab && nextLink?.frameSrc) {
+ window.open(nextLink?.frameSrc, '_blank');
+ return;
+ }
+ navigate(key);
+ };
+
+ const menuStyle: CSSProperties = {
+ background: colorBgElevated,
+ };
+ return (
+
+
+
+ );
+}
diff --git a/src/layouts/dashboard/nav.tsx b/src/layouts/dashboard/nav.tsx
new file mode 100644
index 0000000..1d51a04
--- /dev/null
+++ b/src/layouts/dashboard/nav.tsx
@@ -0,0 +1,163 @@
+import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons';
+import { Menu, MenuProps } from 'antd';
+import Color from 'color';
+import { m } from 'framer-motion';
+import { CSSProperties, useEffect, useMemo, useState } from 'react';
+import { useLocation, useMatches, useNavigate } from 'react-router-dom';
+
+import MotionContainer from '@/components/animate/motion-container';
+import { varSlide } from '@/components/animate/variants';
+import Logo from '@/components/logo';
+import Scrollbar from '@/components/scrollbar';
+import { useRouteToMenuFn, usePermissionRoutes, useFlattenedRoutes } from '@/router/hooks';
+import { menuFilter } from '@/router/utils';
+import { useSettingActions, useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import { NAV_COLLAPSED_WIDTH, NAV_WIDTH } from './config';
+
+import { ThemeLayout } from '#/enum';
+
+const slideInLeft = varSlide({ distance: 10 }).inLeft;
+
+type Props = {
+ closeSideBarDrawer?: () => void;
+};
+export default function Nav(props: Props) {
+ const navigate = useNavigate();
+ const matches = useMatches();
+ const { pathname } = useLocation();
+
+ const { colorPrimary, colorTextBase, colorBgElevated, colorBorder } = useThemeToken();
+
+ const settings = useSettings();
+ const { themeLayout } = settings;
+ const { setSettings } = useSettingActions();
+
+ const menuStyle: CSSProperties = {
+ background: colorBgElevated,
+ };
+
+ const routeToMenuFn = useRouteToMenuFn();
+ const permissionRoutes = usePermissionRoutes();
+ console.log(permissionRoutes, 'permissionRoutes');
+ const menuList = useMemo(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ return routeToMenuFn(menuRoutes);
+ }, [routeToMenuFn, permissionRoutes]);
+
+ console.log(menuList, 'menuList');
+
+ const flattenedRoutes = useFlattenedRoutes();
+
+ /**
+ * state
+ */
+ const [collapsed, setCollapsed] = useState(false);
+ const [openKeys, setOpenKeys] = useState([]);
+ const [menuMode, setMenuMode] = useState('inline');
+
+ useEffect(() => {
+ if (themeLayout === ThemeLayout.Vertical) {
+ const openKeys = matches
+ .filter((match) => match.pathname !== '/')
+ .map((match) => match.pathname);
+ setOpenKeys(openKeys);
+ }
+ }, [matches, themeLayout]);
+
+ useEffect(() => {
+ if (themeLayout === ThemeLayout.Vertical) {
+ setCollapsed(false);
+ setMenuMode('inline');
+ }
+ if (themeLayout === ThemeLayout.Mini) {
+ setCollapsed(true);
+ setMenuMode('inline');
+ }
+ }, [themeLayout]);
+
+ /**
+ * events
+ */
+ const onOpenChange: MenuProps['onOpenChange'] = (keys) => {
+ setOpenKeys(keys);
+ };
+ const onClick: MenuProps['onClick'] = ({ key }) => {
+ const nextLink = flattenedRoutes?.find((el) => el.key === key);
+ if (nextLink?.hideTab && nextLink?.frameSrc) {
+ window.open(nextLink?.frameSrc, '_blank');
+ return;
+ }
+
+ navigate(key);
+ props?.closeSideBarDrawer?.();
+ };
+
+ const setThemeLayout = (themeLayout: ThemeLayout) => {
+ setSettings({
+ ...settings,
+ themeLayout,
+ });
+ };
+
+ const toggleCollapsed = () => {
+ if (!collapsed) {
+ setThemeLayout(ThemeLayout.Mini);
+ } else {
+ setThemeLayout(ThemeLayout.Vertical);
+ }
+ setCollapsed(!collapsed);
+ };
+
+ return (
+
+
+
+
+ {themeLayout !== ThemeLayout.Mini && (
+
+
+ Advertising Admin
+
+
+ )}
+
+
+ {collapsed ? : }
+
+
+
+
+ {/* */}
+
+
+
+ );
+}
diff --git a/src/layouts/simple/index.tsx b/src/layouts/simple/index.tsx
new file mode 100644
index 0000000..8742b7f
--- /dev/null
+++ b/src/layouts/simple/index.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import HeaderSimple from '../_common/header-simple';
+
+type Props = {
+ children: React.ReactNode;
+};
+export default function SimpleLayout({ children }: Props) {
+ const { colorBgElevated, colorTextBase } = useThemeToken();
+ return (
+
+
+ {children}
+
+ );
+}
diff --git a/src/locales/i18n.ts b/src/locales/i18n.ts
new file mode 100644
index 0000000..77f9c65
--- /dev/null
+++ b/src/locales/i18n.ts
@@ -0,0 +1,33 @@
+import i18n from 'i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+import { initReactI18next } from 'react-i18next';
+
+import { getStringItem } from '@/utils/storage';
+
+import en_US from './lang/en_US';
+
+import { LocalEnum, StorageEnum } from '#/enum';
+
+const defaultLng = getStringItem(StorageEnum.I18N) || (LocalEnum.en_US as string);
+i18n
+ // detect user language
+ // learn more: https://github.com/i18next/i18next-browser-languageDetector
+ .use(LanguageDetector)
+ // pass the i18n instance to react-i18next.
+ .use(initReactI18next)
+ // init i18next
+ // for all options read: https://www.i18next.com/overview/configuration-options
+ .init({
+ debug: true,
+ lng: defaultLng, // localstorage -> i18nextLng: en_US
+ fallbackLng: LocalEnum.en_US,
+ interpolation: {
+ escapeValue: false, // not needed for react as it escapes by default
+ },
+ resources: {
+ en_US: { translation: en_US },
+ },
+ });
+
+export default i18n;
+export const { t } = i18n;
diff --git a/src/locales/lang/en_US/common.json b/src/locales/lang/en_US/common.json
new file mode 100644
index 0000000..d21ce6c
--- /dev/null
+++ b/src/locales/lang/en_US/common.json
@@ -0,0 +1,22 @@
+{
+ "common": {
+ "okText": "OK",
+ "closeText": "Close",
+ "cancelText": "Cancel",
+ "loadingText": "Loading...",
+ "saveText": "Save",
+ "delText": "Delete",
+ "resetText": "Reset",
+ "searchText": "Search",
+ "queryText": "Search",
+
+ "inputText": "Please enter",
+ "chooseText": "Please choose",
+
+ "redo": "Refresh",
+ "back": "Back",
+
+ "light": "Light",
+ "dark": "Dark"
+ }
+}
diff --git a/src/locales/lang/en_US/index.ts b/src/locales/lang/en_US/index.ts
new file mode 100644
index 0000000..ebc57c5
--- /dev/null
+++ b/src/locales/lang/en_US/index.ts
@@ -0,0 +1,7 @@
+import common from './common.json';
+import sys from './sys.json';
+
+export default {
+ ...common,
+ ...sys,
+};
diff --git a/src/locales/lang/en_US/sys.json b/src/locales/lang/en_US/sys.json
new file mode 100644
index 0000000..937b2b8
--- /dev/null
+++ b/src/locales/lang/en_US/sys.json
@@ -0,0 +1,148 @@
+{
+ "sys": {
+ "api": {
+ "operationSuccess": "Operation Success",
+ "operationFailed": "Operation failed",
+ "errorTip": "Error Tip",
+ "successTip": "Success Tip",
+ "errorMessage": "The operation failed, the system is abnormal!",
+ "timeoutMessage": "Login timed out, please log in again!",
+ "apiTimeoutMessage": "The interface request timed out, please refresh the page and try again!",
+ "apiRequestFailed": "The interface request failed, please try again later!",
+ "networkException": "network anomaly",
+ "networkExceptionMsg": "Please check if your network connection is normal! The network is abnormal",
+
+ "errMsg401": "The user does not have permission (token, user name, password error)!",
+ "errMsg403": "The user is authorized, but access is forbidden!",
+ "errMsg404": "Network request error, the resource was not found!",
+ "errMsg405": "Network request error, request method not allowed!",
+ "errMsg408": "Network request timed out!",
+ "errMsg500": "Server error, please contact the administrator!",
+ "errMsg501": "The network is not implemented!",
+ "errMsg502": "Network Error!",
+ "errMsg503": "The service is unavailable, the server is temporarily overloaded or maintained!",
+ "errMsg504": "Network timeout!",
+ "errMsg505": "The http version does not support the request!"
+ },
+ "login": {
+ "backSignIn": "Back sign in",
+ "mobileSignInFormTitle": "Mobile sign in",
+ "qrSignInFormTitle": "Qr code sign in",
+ "signInFormTitle": "Sign in",
+ "signUpFormTitle": "Sign up",
+ "forgetFormTitle": "Reset password",
+
+ "signInPrimaryTitle": "Hi, Welcome Back",
+ "signInSecondTitle": "aelfscan AD management background",
+ "signInTitle": "",
+ "signInDesc": "Enter your personal details and get started!",
+ "policy": "I agree to the xxx Privacy Policy",
+ "scanSign": "scanning the code to complete the login",
+ "forgetFormSecondTitle": "Please enter the email address associated with your account and We will email you a link to reset your password.",
+
+ "loginButton": "Sign in",
+ "registerButton": "Sign up",
+ "rememberMe": "Remember me",
+ "forgetPassword": "Forget Password?",
+ "otherSignIn": "Sign in with",
+ "sendSmsButton": "Send SMS code",
+ "sendSmsText": "Reacquire in {{second}}s",
+ "sendEmailButton": "Send Email",
+
+ "loginSuccessTitle": "Login successful",
+ "loginSuccessDesc": "Welcome back",
+
+ "accountPlaceholder": "Please input username",
+ "passwordPlaceholder": "Please input password",
+ "confirmPasswordPlaceholder": "Please input confirm password",
+ "emaildPlaceholder": "Please input email",
+ "smsPlaceholder": "Please input sms code",
+ "mobilePlaceholder": "Please input mobile",
+ "policyPlaceholder": "Register after checking",
+ "diffPwd": "The two passwords are inconsistent",
+
+ "userName": "Username",
+ "password": "Password",
+ "confirmPassword": "Confirm Password",
+ "email": "Email",
+ "smsCode": "SMS code",
+ "mobile": "Mobile",
+
+ "registerAndAgree": "By signing up, I agree to",
+ "termsOfService": " Terms of service ",
+ "privacyPolicy": " Privacy policy ",
+ "logout": "Logout"
+ },
+ "tab": {
+ "fullscreen": "FullScreen",
+ "refresh": "Refresh",
+ "close": "Close",
+ "closeOthers": "Close Others",
+ "closeAll": "Close All",
+ "closeLeft": "Close Left",
+ "closeRight": "Close Right"
+ },
+ "menu": {
+ "dashboard": "Dashboard",
+ "workbench": "Workbench",
+ "analysis": "Analysis",
+ "management": "Management",
+ "user": {
+ "index": "User",
+ "profile": "Profile",
+ "account": "Account"
+ },
+ "system": {
+ "index": "System",
+ "organization": "Organization",
+ "permission": "Permission",
+ "role": "Role",
+ "user": "User",
+ "user_detail": "User Detail"
+ },
+ "blog": "Blog",
+ "components": "Components",
+ "icon": "Icon",
+ "animate": "Animate",
+ "scroll": "Scroll",
+ "markdown": "Markdown",
+ "editor": "Editor",
+ "i18n": "Multi Language",
+ "upload": "Upload",
+ "chart": "Chart",
+ "functions": "Functions",
+ "clipboard": "Clipboard",
+ "token_expired": "Token Expired",
+ "menulevel": {
+ "index": "Menu Level",
+ "1a": "Menu Level 1a",
+ "1b": {
+ "index": "Menu Level 1b",
+ "2a": "Menu Level 2a",
+ "2b": {
+ "index": "Menu Level 2b",
+ "3a": "Menu Level 3a",
+ "3b": "Menu Level 3b"
+ }
+ }
+ },
+ "disabled": "Item Disabled",
+ "label": "Item Label",
+ "frame": "Item External",
+ "external_link": "External Link",
+ "iframe": "Iframe",
+ "blank": "Blank",
+ "calendar": "Calendar",
+ "kanban": "Kanban",
+ "text_advertising": "Text advertising",
+ "banner_advertising": "Banner advertising",
+ "error": {
+ "index": "Error Page",
+ "403": "403",
+ "404": "404",
+ "500": "500"
+ }
+ },
+ "docs": "Document"
+ }
+}
diff --git a/src/locales/useLocale.ts b/src/locales/useLocale.ts
new file mode 100644
index 0000000..9699a67
--- /dev/null
+++ b/src/locales/useLocale.ts
@@ -0,0 +1,49 @@
+import en_US from 'antd/locale/en_US';
+import { useTranslation } from 'react-i18next';
+
+import { LocalEnum } from '#/enum';
+import type { Locale as AntdLocal } from 'antd/es/locale';
+
+type Locale = keyof typeof LocalEnum;
+type Language = {
+ locale: keyof typeof LocalEnum;
+ icon: string;
+ label: string;
+ antdLocal: AntdLocal;
+};
+
+export const LANGUAGE_MAP: Record = {
+ // [LocalEnum.zh_CN]: {
+ // locale: LocalEnum.zh_CN,
+ // label: 'Chinese',
+ // icon: 'ic-locale_zh_CN',
+ // antdLocal: zh_CN,
+ // },
+ [LocalEnum.en_US]: {
+ locale: LocalEnum.en_US,
+ label: 'English',
+ icon: 'ic-locale_en_US',
+ antdLocal: en_US,
+ },
+};
+
+export default function useLocale() {
+ const { i18n } = useTranslation();
+
+ /**
+ * localstorage -> i18nextLng change
+ */
+ const setLocale = (locale: Locale) => {
+ i18n.changeLanguage(locale);
+ };
+
+ const locale = (i18n.resolvedLanguage || LocalEnum.en_US) as Locale;
+
+ const language = LANGUAGE_MAP[locale];
+
+ return {
+ locale,
+ language,
+ setLocale,
+ };
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..8d2f92c
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,49 @@
+// react-query
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
+// react
+import { Analytics } from '@vercel/analytics/react';
+import { Suspense } from 'react';
+import ReactDOM from 'react-dom/client';
+// react helmet
+import { HelmetProvider } from 'react-helmet-async';
+// eslint-disable-next-line import/no-unresolved
+import 'virtual:svg-icons-register';
+
+import App from '@/App';
+
+import worker from './_mock';
+// i18n
+import './locales/i18n';
+// tailwind css
+import './theme/index.css';
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: 3,
+ gcTime: 300_000,
+ staleTime: 10_1000,
+ refetchOnWindowFocus: false,
+ refetchOnReconnect: false,
+ refetchOnMount: false,
+ },
+ },
+});
+
+const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
+
+root.render(
+
+
+
+
+
+
+
+
+ ,
+);
+
+// 🥵 start service worker mock in development mode
+worker.start({ onUnhandledRequest: 'bypass' });
diff --git a/src/pages/banner-advertising/columnConfig.tsx b/src/pages/banner-advertising/columnConfig.tsx
new file mode 100644
index 0000000..d289d72
--- /dev/null
+++ b/src/pages/banner-advertising/columnConfig.tsx
@@ -0,0 +1,89 @@
+import { Button, Space, TableProps } from 'antd';
+import dayjs from 'dayjs';
+
+import { IBannerAdvertisingItem } from './index';
+
+const getColumns = (
+ handleEdit: (record: IBannerAdvertisingItem) => void,
+ handleDelete: (id: string) => void,
+) => {
+ const columns: TableProps['columns'] = [
+ {
+ title: 'adsId',
+ dataIndex: 'adsBannerId',
+ width: '200px',
+ key: 'adsBannerId',
+ render: (text) => {text} ,
+ },
+ {
+ title: 'Advertising name',
+ dataIndex: 'text',
+ key: 'text',
+ },
+ {
+ title: 'link',
+ dataIndex: 'clickLink',
+ key: 'clickLink',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: 'page',
+ dataIndex: 'labels',
+ width: '400px',
+ key: 'labels',
+ render: (text) => (
+
+
+ {text.map((item: string) => {
+ return {item} ;
+ })}
+
+
+ ),
+ },
+ {
+ title: 'Impressions',
+ dataIndex: 'totalVisitCount',
+ key: 'totalVisitCount',
+ },
+ {
+ title: 'createTime',
+ dataIndex: 'createTime',
+ key: 'createTime',
+ render: (text) => {dayjs(text).format('YYYY-MM-DD HH:mm:ss')} ,
+ },
+ {
+ title: 'Action',
+ key: 'action',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {
+ handleEdit(record);
+ }}
+ >
+ edit
+
+ {
+ handleDelete(record.adsBannerId);
+ }}
+ >
+ Delete
+
+
+ ),
+ },
+ ];
+
+ return columns;
+};
+
+export default getColumns;
diff --git a/src/pages/banner-advertising/index.tsx b/src/pages/banner-advertising/index.tsx
new file mode 100644
index 0000000..6cad3bb
--- /dev/null
+++ b/src/pages/banner-advertising/index.tsx
@@ -0,0 +1,435 @@
+import { ExclamationCircleFilled } from '@ant-design/icons';
+import {
+ Button,
+ Checkbox,
+ Col,
+ DatePicker,
+ Form,
+ Input,
+ message,
+ Modal,
+ Row,
+ Select,
+ Space,
+ Table,
+ TableProps,
+} from 'antd';
+import dayjs from 'dayjs';
+import advancedFormat from 'dayjs/plugin/advancedFormat';
+import customParseFormat from 'dayjs/plugin/customParseFormat';
+import localeData from 'dayjs/plugin/localeData';
+import weekday from 'dayjs/plugin/weekday';
+import weekOfYear from 'dayjs/plugin/weekOfYear';
+import weekYear from 'dayjs/plugin/weekYear';
+import { useCallback, useEffect, useState } from 'react';
+
+import advertisingService from '@/api/services/advertisingService';
+import { Upload } from '@/components/upload';
+import { useAWSUploadService } from '@/hooks/useAWSUploadService';
+import { advertisingCounts, BannerAdvertisingLabels } from '@/utils/contant';
+
+import getColumns from './columnConfig';
+
+import { TableParams } from '#/entity';
+
+dayjs.extend(customParseFormat);
+dayjs.extend(advancedFormat);
+dayjs.extend(weekday);
+dayjs.extend(localeData);
+dayjs.extend(weekOfYear);
+dayjs.extend(weekYear);
+
+const { Option } = Select;
+const { RangePicker } = DatePicker;
+
+const formItemLayout = {
+ labelCol: {
+ xs: { span: 24 },
+ sm: { span: 9 },
+ },
+ wrapperCol: {
+ xs: { span: 24 },
+ sm: { span: 14 },
+ },
+};
+
+const { confirm } = Modal;
+
+export interface IBannerAdvertisingItem {
+ adsBannerId: string;
+ id: string;
+ image: string;
+ mobileImage: string;
+ text: string;
+ clickLink: string;
+ labels: Array;
+ createTime: string;
+ updateTime: string;
+ startTime: number;
+ endTime: number;
+ totalVisitCount: number;
+}
+
+export default function Page() {
+ const [form] = Form.useForm();
+ const [queryForm] = Form.useForm();
+
+ const [loading, setLoading] = useState(true);
+
+ const [data, setData] = useState>([]);
+ const [confirmLoading, setConfirmLoading] = useState(false);
+ const [modelLoading, setModelLoading] = useState(false);
+
+ const [adsBannerId, setAdsId] = useState('');
+
+ const [tableParams, setTableParams] = useState({
+ pagination: {
+ current: 1,
+ pageSize: 10,
+ },
+ });
+
+ const fetchData = useCallback(async () => {
+ setLoading(true);
+ const queryData = queryForm.getFieldsValue();
+ console.log(queryData, 'queryDataF');
+ try {
+ const data = await advertisingService.getBannerAdvertisingList({
+ labels: queryData.labels || undefined,
+ adsBannerId: queryData.adsBannerId || undefined,
+ });
+ setData(data.list);
+ setTableParams({
+ pagination: {
+ current: 1,
+ pageSize: tableParams.pagination?.pageSize,
+ },
+ });
+ } catch (error) {
+ console.log(error);
+ } finally {
+ setLoading(false);
+ }
+ }, [queryForm, tableParams.pagination?.pageSize]);
+
+ const showModal = () => {
+ setAdsId('');
+ form.resetFields();
+ setOpen(true);
+ };
+
+ const [open, setOpen] = useState(false);
+
+ const { awsUploadFile } = useAWSUploadService();
+ const onFinish = async (values: any) => {
+ setConfirmLoading(true);
+ console.log(values, 'values');
+ const originLogo = values.image[0];
+ const originMobileImage = values.mobileImage[0];
+ let image = '';
+ let mobileImage = '';
+ try {
+ if (originLogo.url && originMobileImage.url) {
+ image = originLogo.url;
+ mobileImage = originMobileImage.url;
+ } else {
+ const [pcUrl, mobileUrl] = await Promise.all([
+ awsUploadFile(originLogo.originFileObj as File),
+ awsUploadFile(originMobileImage.originFileObj as File),
+ ]);
+ image = pcUrl;
+ mobileImage = mobileUrl;
+ }
+ } catch (error) {
+ message.error('aws upload error');
+ }
+
+ const startTime = dayjs(values.dateRange[0]).valueOf();
+ const endTime = dayjs(values.dateRange[1]).valueOf();
+ const data = {
+ ...values,
+ startTime,
+ endTime,
+ image,
+ adsBannerId,
+ mobileImage,
+ };
+ delete data.dateRange;
+ try {
+ await advertisingService.addBannerAdvertising(data);
+ if (!adsBannerId) {
+ message.success('add success');
+ } else {
+ message.success('edit success');
+ }
+ setOpen(false);
+ setConfirmLoading(false);
+ fetchData();
+ } catch (error) {
+ message.error('add error');
+ setConfirmLoading(false);
+ }
+ };
+
+ const handleOk = () => {
+ form.submit();
+ };
+
+ const handleSearch = () => {
+ fetchData();
+ };
+
+ const handleSearchSet = () => {
+ queryForm.resetFields();
+ fetchData();
+ };
+
+ const handleCancel = () => {
+ setOpen(false);
+ };
+
+ useEffect(() => {
+ fetchData();
+ }, [fetchData]);
+
+ const [messageApi, contextHolder] = message.useMessage();
+
+ const handleEdit = async (params: IBannerAdvertisingItem) => {
+ setModelLoading(true);
+ setOpen(true);
+ const data = await advertisingService.getBannerAdvertisingList({
+ adsBannerId: params.adsBannerId,
+ });
+ setAdsId(params.adsBannerId);
+ const adsItem = data.list[0];
+
+ const dateRange = adsItem.startTime ? [dayjs(adsItem.startTime), dayjs(adsItem.endTime)] : [];
+ const regexFilename = /[^/]+$/;
+ const matchFilename = adsItem.image.match(regexFilename);
+ const fullFilename = matchFilename ? matchFilename[0] : null;
+ const matchFilenameMobile = adsItem.mobileImage.match(regexFilename);
+ const fullFilenameMobile = matchFilenameMobile ? matchFilenameMobile[0] : null;
+
+ form.setFieldsValue({
+ ...adsItem,
+ dateRange,
+ image: adsItem.image
+ ? [
+ {
+ uid: '-1',
+ name: fullFilename,
+ status: 'done',
+ url: adsItem.image,
+ },
+ ]
+ : [],
+ mobileImage: adsItem.mobileImage
+ ? [
+ {
+ uid: '-1',
+ name: fullFilenameMobile,
+ status: 'done',
+ url: adsItem.mobileImage,
+ },
+ ]
+ : [],
+ });
+
+ setModelLoading(false);
+ };
+
+ const handleDelete = (adsBannerId: string) => {
+ confirm({
+ title: 'confirm',
+ icon: ,
+ content: `Are you sure you want to delete this AD with AD id ${adsBannerId} ?`,
+ onOk() {
+ return new Promise((resolve, reject) => {
+ advertisingService
+ .delBannerAdvertising({ adsBannerId })
+ .then(() => {
+ fetchData();
+ resolve(true);
+ messageApi.success('Delete successfully');
+ })
+ .catch((err) => {
+ reject(err);
+ messageApi.error(err?.message);
+ });
+ }).catch(() => console.log('Oops errors!'));
+ },
+ onCancel() {},
+ });
+ };
+
+ const handleTableChange: TableProps['onChange'] = (pagination) => {
+ setTableParams({
+ pagination,
+ });
+
+ // `dataSource` is useless since `pageSize` changed
+ if (pagination.pageSize !== tableParams.pagination?.pageSize) {
+ setData([]);
+ }
+ };
+
+ const columns = getColumns(handleEdit, handleDelete);
+
+ return (
+
+ );
+}
diff --git a/src/pages/components/animate/control-panel.tsx b/src/pages/components/animate/control-panel.tsx
new file mode 100644
index 0000000..ea34d34
--- /dev/null
+++ b/src/pages/components/animate/control-panel.tsx
@@ -0,0 +1,45 @@
+import { Card } from 'antd';
+
+import { useThemeToken } from '@/theme/hooks';
+
+type Props = {
+ variantKey: {
+ type: string;
+ values: string[];
+ }[];
+ selectedVariant: string;
+ onChangeVarient: (varient: string) => void;
+};
+export default function ControlPanel({ variantKey, selectedVariant, onChangeVarient }: Props) {
+ const { colorPrimary, colorTextBase } = useThemeToken();
+
+ const selectedStyle = (variantKey: string) => {
+ return variantKey === selectedVariant
+ ? {
+ backgroundColor: colorPrimary,
+ color: colorTextBase,
+ }
+ : {};
+ };
+ return (
+
+ {variantKey.map((item) => (
+
+
{item.type.toUpperCase()}
+
+ {item.values.map((item) => (
+ onChangeVarient(item)}
+ style={selectedStyle(item)}
+ >
+ {item}
+
+ ))}
+
+
+ ))}
+
+ );
+}
diff --git a/src/pages/components/animate/index.tsx b/src/pages/components/animate/index.tsx
new file mode 100644
index 0000000..1bdb6e1
--- /dev/null
+++ b/src/pages/components/animate/index.tsx
@@ -0,0 +1,29 @@
+import { Tabs, TabsProps, Typography } from 'antd';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import BackgroundView from './views/background';
+import Inview from './views/inview';
+import ScrollView from './views/scroll';
+
+export default function AnimatePage() {
+ const { colorPrimary } = useThemeToken();
+ const TABS: TabsProps['items'] = [
+ { key: 'inview', label: 'In View', children: },
+ { key: 'scroll', label: 'Scroll', children: },
+ { key: 'background', label: 'Background', children: },
+ ];
+
+ return (
+ <>
+
+ https://www.framer.com/motion/
+
+
+ >
+ );
+}
diff --git a/src/pages/components/animate/views/background/container.tsx b/src/pages/components/animate/views/background/container.tsx
new file mode 100644
index 0000000..d491b3c
--- /dev/null
+++ b/src/pages/components/animate/views/background/container.tsx
@@ -0,0 +1,32 @@
+import { m } from 'framer-motion';
+import { useMemo } from 'react';
+
+import Cover3 from '@/assets/images/cover/cover_3.jpg';
+import MotionContainer from '@/components/animate/motion-container';
+import { getVariant } from '@/components/animate/variants';
+import { useThemeToken } from '@/theme/hooks';
+
+type Props = {
+ variant: string;
+};
+export default function ContainerView({ variant }: Props) {
+ const { colorBgLayout } = useThemeToken();
+ const varients = useMemo(() => getVariant(variant), [variant]);
+ const isKenburns = variant.includes('kenburns');
+
+ return (
+
+
+ {isKenburns ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
diff --git a/src/pages/components/animate/views/background/index.tsx b/src/pages/components/animate/views/background/index.tsx
new file mode 100644
index 0000000..63b0e06
--- /dev/null
+++ b/src/pages/components/animate/views/background/index.tsx
@@ -0,0 +1,55 @@
+import { Card, Row, Col } from 'antd';
+import { useMemo, useState } from 'react';
+
+import ControlPanel from '../../control-panel';
+
+import ContainerView from './container';
+import Toolbar from './toolbar';
+
+export default function BackgroundView() {
+ const defaultValue = useMemo(() => {
+ return {
+ selectedVariant: 'kenburnsTop',
+ };
+ }, []);
+ const [selectedVariant, setSelectedVariant] = useState(defaultValue.selectedVariant);
+
+ const onRefresh = () => {
+ setSelectedVariant(defaultValue.selectedVariant);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ setSelectedVariant(varient)}
+ />
+
+
+
+ );
+}
+const variantKey = [
+ {
+ type: 'kenburns',
+ values: ['kenburnsTop', 'kenburnsBottom', 'kenburnsLeft', 'kenburnsRight'],
+ },
+ {
+ type: 'pan',
+ values: ['panTop', 'panBottom', 'panLeft', 'panRight'],
+ },
+ {
+ type: 'color change',
+ values: ['color2x', 'color3x', 'color4x', 'color5x'],
+ },
+];
diff --git a/src/pages/components/animate/views/background/toolbar.tsx b/src/pages/components/animate/views/background/toolbar.tsx
new file mode 100644
index 0000000..30e8b2d
--- /dev/null
+++ b/src/pages/components/animate/views/background/toolbar.tsx
@@ -0,0 +1,12 @@
+import { ReloadOutlined } from '@ant-design/icons';
+
+type Props = {
+ onRefresh: VoidFunction;
+};
+export default function Toolbar({ onRefresh }: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/pages/components/animate/views/inview/container.tsx b/src/pages/components/animate/views/inview/container.tsx
new file mode 100644
index 0000000..ecf805b
--- /dev/null
+++ b/src/pages/components/animate/views/inview/container.tsx
@@ -0,0 +1,55 @@
+import { m } from 'framer-motion';
+import { repeat } from 'ramda';
+import { useMemo } from 'react';
+
+import Cover3 from '@/assets/images/cover/cover_3.jpg';
+import MotionContainer from '@/components/animate/motion-container';
+import { getVariant } from '@/components/animate/variants';
+import { useThemeToken } from '@/theme/hooks';
+
+const TEXT = 'SlashAdmin';
+type Props = {
+ isText: boolean;
+ isMulti: boolean;
+ variant: string;
+};
+export default function ContainerView({ isText, variant, isMulti }: Props) {
+ const { colorBgLayout } = useThemeToken();
+ const varients = useMemo(() => getVariant(variant), [variant]);
+ const imgs = useMemo(() => (isMulti ? repeat(Cover3, 5) : [Cover3]), [isMulti]);
+
+ return (
+
+ {isText ? (
+
+ {TEXT.split('').map((letter, index) => (
+
+ {letter}
+
+ ))}
+
+ ) : (
+
+ {imgs.map((img, index) => (
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/src/pages/components/animate/views/inview/index.tsx b/src/pages/components/animate/views/inview/index.tsx
new file mode 100644
index 0000000..89c120c
--- /dev/null
+++ b/src/pages/components/animate/views/inview/index.tsx
@@ -0,0 +1,115 @@
+import { Card, Col, Row } from 'antd';
+import { useMemo, useState } from 'react';
+
+import ControlPanel from '../../control-panel';
+
+import ContainerView from './container';
+import Toolbar from './toolbar';
+
+const variantKey = [
+ {
+ type: 'slide in',
+ values: ['slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight'],
+ },
+ {
+ type: 'slide out',
+ values: ['slideOutUp', 'slideOutDown', 'slideOutLeft', 'slideOutRight'],
+ },
+ {
+ type: 'fade in',
+ values: ['fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight'],
+ },
+ {
+ type: 'fade out',
+ values: ['fadeOut', 'fadeOutUp', 'fadeOutDown', 'fadeOutLeft', 'fadeOutRight'],
+ },
+ {
+ type: 'zoom in',
+ values: ['zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInLeft', 'zoomInRight'],
+ },
+ {
+ type: 'zoom out',
+ values: ['zoomOut', 'zoomOutUp', 'zoomOutDown', 'zoomOutLeft', 'zoomOutRight'],
+ },
+ {
+ type: 'bounce in',
+ values: ['bounceIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight'],
+ },
+ {
+ type: 'bounce out',
+ values: ['bounceOut', 'bounceOutUp', 'bounceOutDown', 'bounceOutLeft', 'bounceOutRight'],
+ },
+ {
+ type: 'flip in',
+ values: ['flipInX', 'flipInY'],
+ },
+ {
+ type: 'flip out',
+ values: ['flipOutX', 'flipOutY'],
+ },
+ {
+ type: 'scale in',
+ values: ['scaleInX', 'scaleInY'],
+ },
+ {
+ type: 'scale out',
+ values: ['scaleOutX', 'scaleOutY'],
+ },
+ {
+ type: 'rotate in',
+ values: ['rotateIn'],
+ },
+ {
+ type: 'rotate out',
+ values: ['rotateOut'],
+ },
+];
+
+export default function Inview() {
+ const defaultValue = useMemo(() => {
+ return {
+ isText: false,
+ isMulti: false,
+ selectedVariant: 'slideInUp',
+ };
+ }, []);
+
+ const [isText, setIsText] = useState(defaultValue.isText);
+ const [isMulti, setIsMulti] = useState(defaultValue.isMulti);
+
+ const [selectedVariant, setSelectedVariant] = useState(defaultValue.selectedVariant);
+
+ const onRefresh = () => {
+ setIsText(defaultValue.isText);
+ setIsMulti(defaultValue.isMulti);
+ setSelectedVariant(defaultValue.selectedVariant);
+ };
+
+ return (
+
+
+
+ setIsText(!isText)}
+ isMulti={isMulti}
+ onChangeMulti={() => setIsMulti(!isMulti)}
+ onRefresh={onRefresh}
+ />
+
+
+
+
+
+
+
+ setSelectedVariant(varient)}
+ />
+
+
+
+ );
+}
diff --git a/src/pages/components/animate/views/inview/toolbar.tsx b/src/pages/components/animate/views/inview/toolbar.tsx
new file mode 100644
index 0000000..eaaa592
--- /dev/null
+++ b/src/pages/components/animate/views/inview/toolbar.tsx
@@ -0,0 +1,35 @@
+import { ReloadOutlined } from '@ant-design/icons';
+import { Switch } from 'antd';
+
+type Props = {
+ isText: boolean;
+ isMulti: boolean;
+ onChnageText: (isText: boolean) => void;
+ onChangeMulti: (isMulti: boolean) => void;
+ onRefresh: VoidFunction;
+};
+export default function Toolbar({
+ isText,
+ isMulti,
+ onChnageText,
+ onChangeMulti,
+ onRefresh,
+}: Props) {
+ return (
+
+
+
+ Text Object
+
+
+ {isText ? null : (
+
+
+ Multi Item
+
+ )}
+
+
+
+ );
+}
diff --git a/src/pages/components/animate/views/scroll/container.tsx b/src/pages/components/animate/views/scroll/container.tsx
new file mode 100644
index 0000000..56c2626
--- /dev/null
+++ b/src/pages/components/animate/views/scroll/container.tsx
@@ -0,0 +1,30 @@
+import { Card, Typography } from 'antd';
+import { useMemo } from 'react';
+
+import MotionViewport from '@/components/animate/motion-viewport';
+import { getVariant } from '@/components/animate/variants';
+import { useThemeToken } from '@/theme/hooks';
+
+type Props = {
+ variant: string;
+};
+export default function ContainerView({ variant }: Props) {
+ const { colorBgLayout } = useThemeToken();
+ const varients = useMemo(() => getVariant(variant), [variant]);
+
+ return (
+
+ {[...Array(40)].map((_, index) => (
+
+
+ Item {index + 1}
+
+
+ ))}
+
+ );
+}
diff --git a/src/pages/components/animate/views/scroll/index.tsx b/src/pages/components/animate/views/scroll/index.tsx
new file mode 100644
index 0000000..a99de34
--- /dev/null
+++ b/src/pages/components/animate/views/scroll/index.tsx
@@ -0,0 +1,72 @@
+import { Card, Row, Col } from 'antd';
+import { useMemo, useState } from 'react';
+
+import ControlPanel from '../../control-panel';
+
+import ContainerView from './container';
+import Toolbar from './toolbar';
+
+export default function ScrollView() {
+ const defaultValue = useMemo(() => {
+ return {
+ selectedVariant: 'slideInUp',
+ };
+ }, []);
+ const [selectedVariant, setSelectedVariant] = useState(defaultValue.selectedVariant);
+
+ const onRefresh = () => {
+ setSelectedVariant(defaultValue.selectedVariant);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ setSelectedVariant(varient)}
+ />
+
+
+
+ );
+}
+
+const variantKey = [
+ {
+ type: 'slide',
+ values: ['slideInUp', 'slideInDown', 'slideInLeft', 'slideInRight'],
+ },
+ {
+ type: 'fade',
+ values: ['fadeIn', 'fadeInUp', 'fadeInDown', 'fadeInLeft', 'fadeInRight'],
+ },
+ {
+ type: 'zoom',
+ values: ['zoomIn', 'zoomInUp', 'zoomInDown', 'zoomInLeft', 'zoomInRight'],
+ },
+ {
+ type: 'bounce',
+ values: ['bounceIn', 'bounceInUp', 'bounceInDown', 'bounceInLeft', 'bounceInRight'],
+ },
+ {
+ type: 'flip',
+ values: ['flipInX', 'flipInY'],
+ },
+ {
+ type: 'scale',
+ values: ['scaleInX', 'scaleInY'],
+ },
+ {
+ type: 'rotate',
+ values: ['rotateIn'],
+ },
+];
diff --git a/src/pages/components/animate/views/scroll/toolbar.tsx b/src/pages/components/animate/views/scroll/toolbar.tsx
new file mode 100644
index 0000000..30e8b2d
--- /dev/null
+++ b/src/pages/components/animate/views/scroll/toolbar.tsx
@@ -0,0 +1,12 @@
+import { ReloadOutlined } from '@ant-design/icons';
+
+type Props = {
+ onRefresh: VoidFunction;
+};
+export default function Toolbar({ onRefresh }: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/pages/components/chart/index.tsx b/src/pages/components/chart/index.tsx
new file mode 100644
index 0000000..29f6633
--- /dev/null
+++ b/src/pages/components/chart/index.tsx
@@ -0,0 +1,99 @@
+import { Card, Col, Row, Typography } from 'antd';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import ChartArea from './view/chart-area';
+import ChartBar from './view/chart-bar';
+import ChartColumnMultiple from './view/chart-column-multiple';
+import ChartColumnNegative from './view/chart-column-negative';
+import ChartColumnSingle from './view/chart-column-single';
+import ChartColumnStacked from './view/chart-column-Stacked';
+import ChartDonut from './view/chart-donut';
+import ChartLine from './view/chart-line';
+import ChartMixed from './view/chart-mixed';
+import ChartPie from './view/chart-pie';
+import ChartRadar from './view/chart-radar';
+import ChartRadial from './view/chart-radial';
+
+export default function ChartPage() {
+ const { colorPrimary } = useThemeToken();
+ return (
+ <>
+
+ https://apexcharts.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/pages/components/chart/view/chart-area.tsx b/src/pages/components/chart/view/chart-area.tsx
new file mode 100644
index 0000000..c759eaf
--- /dev/null
+++ b/src/pages/components/chart/view/chart-area.tsx
@@ -0,0 +1,30 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [
+ { name: 'series1', data: [31, 40, 28, 51, 42, 109, 100] },
+ { name: 'series2', data: [11, 32, 45, 32, 34, 52, 41] },
+];
+export default function ChartArea() {
+ const chartOptions = useChart({
+ xaxis: {
+ type: 'datetime',
+ categories: [
+ '2018-09-19T00:00:00.000Z',
+ '2018-09-19T01:30:00.000Z',
+ '2018-09-19T02:30:00.000Z',
+ '2018-09-19T03:30:00.000Z',
+ '2018-09-19T04:30:00.000Z',
+ '2018-09-19T05:30:00.000Z',
+ '2018-09-19T06:30:00.000Z',
+ ],
+ },
+ tooltip: {
+ x: {
+ format: 'dd/MM/yy HH:mm',
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-bar.tsx b/src/pages/components/chart/view/chart-bar.tsx
new file mode 100644
index 0000000..1984107
--- /dev/null
+++ b/src/pages/components/chart/view/chart-bar.tsx
@@ -0,0 +1,29 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [400, 430, 448, 470, 540, 580, 690, 1100, 1200, 1380];
+
+export default function ChartBar() {
+ const chartOptions = useChart({
+ stroke: { show: false },
+ plotOptions: {
+ bar: { horizontal: true, barHeight: '30%' },
+ },
+ xaxis: {
+ categories: [
+ 'Italy',
+ 'Japan',
+ 'China',
+ 'Canada',
+ 'France',
+ 'Germany',
+ 'South Korea',
+ 'Netherlands',
+ 'United States',
+ 'United Kingdom',
+ ],
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-column-Stacked.tsx b/src/pages/components/chart/view/chart-column-Stacked.tsx
new file mode 100644
index 0000000..c3ab8ad
--- /dev/null
+++ b/src/pages/components/chart/view/chart-column-Stacked.tsx
@@ -0,0 +1,47 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [
+ { name: 'Product A', data: [44, 55, 41, 67, 22, 43] },
+ { name: 'Product B', data: [13, 23, 20, 8, 13, 27] },
+ { name: 'Product C', data: [11, 17, 15, 15, 21, 14] },
+ { name: 'Product D', data: [21, 7, 25, 13, 22, 8] },
+];
+export default function ChartColumnStacked() {
+ const chartOptions = useChart({
+ chart: {
+ stacked: true,
+ zoom: {
+ enabled: true,
+ },
+ },
+ legend: {
+ itemMargin: {
+ vertical: 8,
+ },
+ position: 'right',
+ offsetY: 20,
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '16%',
+ },
+ },
+ stroke: {
+ show: false,
+ },
+ xaxis: {
+ type: 'datetime',
+ categories: [
+ '01/01/2011 GMT',
+ '01/02/2011 GMT',
+ '01/03/2011 GMT',
+ '01/04/2011 GMT',
+ '01/05/2011 GMT',
+ '01/06/2011 GMT',
+ ],
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-column-multiple.tsx b/src/pages/components/chart/view/chart-column-multiple.tsx
new file mode 100644
index 0000000..01fe89a
--- /dev/null
+++ b/src/pages/components/chart/view/chart-column-multiple.tsx
@@ -0,0 +1,33 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [
+ {
+ name: 'Net Profit',
+ data: [44, 55, 57, 56, 61, 58, 63, 60, 66],
+ },
+ {
+ name: 'Revenue',
+ data: [76, 85, 101, 98, 87, 105, 91, 114, 94],
+ },
+];
+export default function ChartColumnMultiple() {
+ const chartOptions = useChart({
+ stroke: {
+ show: true,
+ width: 2,
+ colors: ['transparent'],
+ },
+ xaxis: {
+ categories: ['Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'],
+ },
+ tooltip: {
+ y: {
+ formatter: (value: number) => `$ ${value} thousands`,
+ },
+ },
+ plotOptions: { bar: { columnWidth: '36%' } },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-column-negative.tsx b/src/pages/components/chart/view/chart-column-negative.tsx
new file mode 100644
index 0000000..637e372
--- /dev/null
+++ b/src/pages/components/chart/view/chart-column-negative.tsx
@@ -0,0 +1,76 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+import { useThemeToken } from '@/theme/hooks';
+
+const series = [
+ {
+ name: 'Cash Flow',
+ data: [
+ 1.45, 5.42, 5.9, -0.42, -12.6, -18.1, -18.2, -14.16, -11.1, -6.09, 0.34, 3.88, 13.07, 5.8, 2,
+ 7.37, 8.1, 13.57, 15.75, 17.1, 19.8, -27.03, -54.4, -47.2, -43.3, -18.6, -48.6, -41.1, -39.6,
+ -37.6, -29.4, -21.4, -2.4,
+ ],
+ },
+];
+export default function ChartColumnNegative() {
+ const theme = useThemeToken();
+ const chartOptions = useChart({
+ stroke: { show: false },
+ yaxis: {
+ labels: {
+ formatter: (value: number) => `${value.toFixed(0)}%`,
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ categories: [
+ '2011-01-01',
+ '2011-02-01',
+ '2011-03-01',
+ '2011-04-01',
+ '2011-05-01',
+ '2011-06-01',
+ '2011-07-01',
+ '2011-08-01',
+ '2011-09-01',
+ '2011-10-01',
+ '2011-11-01',
+ '2011-12-01',
+ '2012-01-01',
+ '2012-02-01',
+ '2012-03-01',
+ '2012-04-01',
+ '2012-05-01',
+ '2012-06-01',
+ '2012-07-01',
+ '2012-08-01',
+ '2012-09-01',
+ '2012-10-01',
+ '2012-11-01',
+ '2012-12-01',
+ '2013-01-01',
+ '2013-02-01',
+ '2013-03-01',
+ '2013-04-01',
+ '2013-05-01',
+ '2013-06-01',
+ '2013-07-01',
+ '2013-08-01',
+ '2013-09-01',
+ ],
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '58%',
+ colors: {
+ ranges: [
+ { from: -100, to: -46, color: theme.colorWarning },
+ { from: -45, to: 0, color: theme.colorInfo },
+ ],
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-column-single.tsx b/src/pages/components/chart/view/chart-column-single.tsx
new file mode 100644
index 0000000..bd71d4e
--- /dev/null
+++ b/src/pages/components/chart/view/chart-column-single.tsx
@@ -0,0 +1,26 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [{ name: 'Net Profit', data: [44, 55, 57, 56, 61, 58, 63, 60, 66] }];
+export default function ChartColumnSingle() {
+ const chartOptions = useChart({
+ plotOptions: {
+ bar: {
+ columnWidth: '16%',
+ },
+ },
+ stroke: {
+ show: false,
+ },
+ xaxis: {
+ categories: ['Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'],
+ },
+ tooltip: {
+ y: {
+ formatter: (value: number) => `$ ${value} thousands`,
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-donut.tsx b/src/pages/components/chart/view/chart-donut.tsx
new file mode 100644
index 0000000..aad488a
--- /dev/null
+++ b/src/pages/components/chart/view/chart-donut.tsx
@@ -0,0 +1,27 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [44, 55, 13, 43];
+export default function ChartDonut() {
+ const chartOptions = useChart({
+ labels: ['Apple', 'Mango', 'Orange', 'Watermelon'],
+ stroke: {
+ show: false,
+ },
+ legend: {
+ horizontalAlign: 'center',
+ },
+ tooltip: {
+ fillSeriesColor: false,
+ },
+ plotOptions: {
+ pie: {
+ donut: {
+ size: '90%',
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-line.tsx b/src/pages/components/chart/view/chart-line.tsx
new file mode 100644
index 0000000..1e1994a
--- /dev/null
+++ b/src/pages/components/chart/view/chart-line.tsx
@@ -0,0 +1,24 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [
+ {
+ name: 'Desktops',
+ data: [10, 41, 35, 51, 49, 62, 69, 91, 148],
+ },
+];
+export default function ChartLine() {
+ const chartOptions = useChart({
+ xaxis: {
+ categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'],
+ },
+ tooltip: {
+ x: {
+ show: false,
+ },
+ marker: { show: false },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-mixed.tsx b/src/pages/components/chart/view/chart-mixed.tsx
new file mode 100644
index 0000000..6d925ae
--- /dev/null
+++ b/src/pages/components/chart/view/chart-mixed.tsx
@@ -0,0 +1,68 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [
+ {
+ name: 'Team A',
+ type: 'column',
+ data: [23, 11, 22, 27, 13, 22, 37, 21, 44, 22, 30],
+ },
+ {
+ name: 'Team B',
+ type: 'area',
+ data: [44, 55, 41, 67, 22, 43, 21, 41, 56, 27, 43],
+ },
+ {
+ name: 'Team C',
+ type: 'line',
+ data: [30, 25, 36, 30, 45, 35, 64, 52, 59, 36, 39],
+ },
+];
+
+export default function ChartMixed() {
+ const chartOptions = useChart({
+ stroke: {
+ width: [0, 2, 3],
+ },
+ plotOptions: {
+ bar: { columnWidth: '20%' },
+ },
+ fill: {
+ type: ['solid', 'gradient', 'solid'],
+ },
+ labels: [
+ '01/01/2003',
+ '02/01/2003',
+ '03/01/2003',
+ '04/01/2003',
+ '05/01/2003',
+ '06/01/2003',
+ '07/01/2003',
+ '08/01/2003',
+ '09/01/2003',
+ '10/01/2003',
+ '11/01/2003',
+ ],
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ title: { text: 'Points' },
+ min: 0,
+ },
+ tooltip: {
+ shared: true,
+ intersect: false,
+ y: {
+ formatter: (value: number) => {
+ if (typeof value !== 'undefined') {
+ return `${value.toFixed(0)} points`;
+ }
+ return value;
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-pie.tsx b/src/pages/components/chart/view/chart-pie.tsx
new file mode 100644
index 0000000..ab8a7ac
--- /dev/null
+++ b/src/pages/components/chart/view/chart-pie.tsx
@@ -0,0 +1,35 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+const series = [44, 55, 13, 43];
+export default function ChartPie() {
+ const chartOptions = useChart({
+ labels: ['America', 'Asia', 'Europe', 'Africa'],
+ legend: {
+ horizontalAlign: 'center',
+ },
+ stroke: {
+ show: false,
+ },
+ dataLabels: {
+ enabled: true,
+ dropShadow: {
+ enabled: false,
+ },
+ },
+ tooltip: {
+ fillSeriesColor: false,
+ },
+ plotOptions: {
+ pie: {
+ donut: {
+ labels: {
+ show: false,
+ },
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-radar.tsx b/src/pages/components/chart/view/chart-radar.tsx
new file mode 100644
index 0000000..78f84be
--- /dev/null
+++ b/src/pages/components/chart/view/chart-radar.tsx
@@ -0,0 +1,44 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+import { useThemeToken } from '@/theme/hooks';
+
+const series = [
+ {
+ name: 'Series 1',
+ data: [80, 50, 30, 40, 100, 20],
+ },
+ {
+ name: 'Series 2',
+ data: [20, 30, 40, 80, 20, 80],
+ },
+ {
+ name: 'Series 3',
+ data: [44, 76, 78, 13, 43, 10],
+ },
+];
+export default function ChartRadar() {
+ const { colorText } = useThemeToken();
+ const chartOptions = useChart({
+ stroke: {
+ width: 2,
+ },
+ fill: {
+ opacity: 0.48,
+ },
+ legend: {
+ floating: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ },
+ xaxis: {
+ categories: ['2011', '2012', '2013', '2014', '2015', '2016'],
+ labels: {
+ style: {
+ colors: [colorText, colorText, colorText, colorText, colorText, colorText],
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/chart/view/chart-radial.tsx b/src/pages/components/chart/view/chart-radial.tsx
new file mode 100644
index 0000000..47aebfe
--- /dev/null
+++ b/src/pages/components/chart/view/chart-radial.tsx
@@ -0,0 +1,37 @@
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+import { fNumber } from '@/utils/format-number';
+
+const series = [44, 55];
+export default function ChartRadial() {
+ const chartOptions = useChart({
+ chart: {
+ sparkline: {
+ enabled: true,
+ },
+ },
+ labels: ['Apples', 'Oranges'],
+ legend: {
+ floating: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ },
+ plotOptions: {
+ radialBar: {
+ hollow: {
+ size: '68%',
+ },
+ dataLabels: {
+ value: {
+ offsetY: 16,
+ },
+ total: {
+ formatter: () => fNumber(2324),
+ },
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/components/editor/index.tsx b/src/pages/components/editor/index.tsx
new file mode 100644
index 0000000..da8e08a
--- /dev/null
+++ b/src/pages/components/editor/index.tsx
@@ -0,0 +1,30 @@
+import { Card, Typography } from 'antd';
+import { useState } from 'react';
+
+import Editor from '@/components/editor';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function EditorPage() {
+ const [quillSimple, setQuillSimple] = useState('');
+ const [quillFull, setQuillFull] = useState('');
+ const { colorPrimary } = useThemeToken();
+
+ return (
+ <>
+
+ https://github.com/zenoamaro/react-quill
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/pages/components/icon/index.tsx b/src/pages/components/icon/index.tsx
new file mode 100644
index 0000000..71b4d66
--- /dev/null
+++ b/src/pages/components/icon/index.tsx
@@ -0,0 +1,70 @@
+import { StepBackwardOutlined } from '@ant-design/icons';
+import { Card, Space, Typography } from 'antd';
+
+import { Iconify, SvgIcon } from '@/components/icon';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function IconPage() {
+ const { colorPrimary, colorInfo, colorSuccess, colorWarning, colorError } = useThemeToken();
+ return (
+
+
+ For more info
+
+ click here
+
+
+
+ {`import { StepBackwardOutlined } from '@ant-design/icons';`}
+ {` `}
+
+
+
+
+
+
+
+ Simply beautiful open source icons. For more info
+
+ click here
+
+
+
+ {` `}
+
+
+
+
+
+
+
+
+
+
+
+ For more info
+
+ click here
+
+
+
+ {` `}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/components/markdown/index.tsx b/src/pages/components/markdown/index.tsx
new file mode 100644
index 0000000..9256e61
--- /dev/null
+++ b/src/pages/components/markdown/index.tsx
@@ -0,0 +1,86 @@
+import { Card, Typography } from 'antd';
+import { useState } from 'react';
+
+import Markdown from '@/components/markdown';
+import { useThemeToken } from '@/theme/hooks';
+
+const TEXT = `
+# h1
+
+
+
+## h2
+
+
+
+**Paragraph** Lorem ipsum is placeholder text commonly used in the graphic, print, and publishing industries for previewing layouts and visual mockups.
+
+
+
+[Link (https://www.google.com/)](https://www.google.com/)
+
+
+
+###### Lists
+
+
+
+- [x] Write the press release
+- [ ] Update the website
+- [ ] Contact the media
+
+
+
+---
+
+
+
+###### A table:
+
+
+
+| Syntax | Description | Test Text |
+| :--- | :----: | ---: |
+| Header | Title | Here's this |
+| Paragraph | Text | And more |
+
+
+
+\`\`\`tsx
+import React from 'react';
+import ReactDOM from 'react-dom';
+import ReactMarkdown from 'react-markdown';
+import rehypeHighlight from 'rehype-highlight';
+
+ReactDOM.render(
+ {'# Your markdown here'} ,
+ document.querySelector('#content')
+);
+\`\`\`
+
+
+
+
+
+> A block quote with ~~strikethrough~~ and a URL: [https://reactjs.org](https://reactjs.org).
+
+`;
+
+export default function MarkdownPage() {
+ const [content] = useState(TEXT);
+ const { colorPrimary } = useThemeToken();
+ return (
+ <>
+
+ https://github.com/remarkjs/react-markdown
+
+
+ {content}
+
+ >
+ );
+}
diff --git a/src/pages/components/multi-language/index.tsx b/src/pages/components/multi-language/index.tsx
new file mode 100644
index 0000000..d2804c6
--- /dev/null
+++ b/src/pages/components/multi-language/index.tsx
@@ -0,0 +1,43 @@
+import { Card, Pagination, Radio, Space, Typography } from 'antd';
+
+import { SvgIcon } from '@/components/icon';
+import useLocale from '@/locales/useLocale';
+import { useThemeToken } from '@/theme/hooks';
+
+import { LocalEnum } from '#/enum';
+
+export default function MultiLanguagePage() {
+ const {
+ setLocale,
+ locale,
+ language: { icon, label },
+ } = useLocale();
+
+ const { colorPrimary } = useThemeToken();
+
+ return (
+
+
+ https://www.i18next.com
+
+
+ https://ant.design/docs/react/i18n-cn
+
+
+ setLocale(e.target.value)} value={locale}>
+ English
+ {/* Chinese */}
+
+
+
+
+ {label}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/components/scroll/index.tsx b/src/pages/components/scroll/index.tsx
new file mode 100644
index 0000000..31f7a07
--- /dev/null
+++ b/src/pages/components/scroll/index.tsx
@@ -0,0 +1,13 @@
+import { TabsProps, Tabs } from 'antd';
+
+import ScrollbarView from './views/scroll-bar';
+import ScrollProgressView from './views/scroll-progress';
+
+export default function ScrollPage() {
+ const TABS: TabsProps['items'] = [
+ { key: 'scrollbar', label: 'Scrollbar', children: },
+ { key: 'scroll-progress', label: 'ScrollProgress', children: },
+ ];
+
+ return ;
+}
diff --git a/src/pages/components/scroll/views/scroll-bar/index.tsx b/src/pages/components/scroll/views/scroll-bar/index.tsx
new file mode 100644
index 0000000..0eef12a
--- /dev/null
+++ b/src/pages/components/scroll/views/scroll-bar/index.tsx
@@ -0,0 +1,37 @@
+import { faker } from '@faker-js/faker';
+import { Card, Col, Row, Typography } from 'antd';
+
+import Scrollbar from '@/components/scrollbar';
+import { useThemeToken } from '@/theme/hooks';
+
+const TEXT = faker.lorem.paragraphs({ min: 20, max: 30 });
+export default function ScrollbarView() {
+ const { colorPrimary } = useThemeToken();
+ return (
+ <>
+
+ https://grsmto.github.io/simplebar/
+
+
+
+
+
+ {TEXT}
+
+
+
+
+
+
+ {TEXT}
+
+
+
+
+ >
+ );
+}
diff --git a/src/pages/components/scroll/views/scroll-progress/index.tsx b/src/pages/components/scroll/views/scroll-progress/index.tsx
new file mode 100644
index 0000000..d4aaae6
--- /dev/null
+++ b/src/pages/components/scroll/views/scroll-progress/index.tsx
@@ -0,0 +1,34 @@
+import { faker } from '@faker-js/faker';
+import { Card, Typography } from 'antd';
+import { useScroll } from 'framer-motion';
+import { useRef } from 'react';
+
+import ScrollProgress from '@/components/scroll-progress';
+import { useThemeToken } from '@/theme/hooks';
+
+const TEXT = faker.lorem.paragraphs({ min: 20, max: 30 });
+export default function ScrollProgressView() {
+ const containerRef = useRef(null);
+ const containerScroll = useScroll({ container: containerRef });
+
+ const { colorPrimary } = useThemeToken();
+ return (
+ <>
+
+ https://www.framer.com/motion/
+
+
+
+
+ {[...Array(4)].map((_, index) => (
+
{TEXT}
+ ))}
+
+
+ >
+ );
+}
diff --git a/src/pages/components/upload/index.tsx b/src/pages/components/upload/index.tsx
new file mode 100644
index 0000000..b5436e8
--- /dev/null
+++ b/src/pages/components/upload/index.tsx
@@ -0,0 +1,67 @@
+import { Card, Col, Row, Space, Switch, Tabs, TabsProps, Typography } from 'antd';
+import { useState } from 'react';
+
+import { Iconify } from '@/components/icon';
+import { Upload, UploadAvatar, UploadBox } from '@/components/upload';
+
+export default function UploadPage() {
+ const [thumbnail, setThumbnail] = useState(false);
+
+ const onChange = (checked: boolean) => {
+ setThumbnail(checked);
+ };
+
+ const ThumbnailSwitch = ;
+
+ const boxPlaceHolder = (
+
+
+
+ Upload File
+
+
+ );
+ const UploadFileTab = (
+
+
+
+
+
+
+
+
+ );
+ const UploadAvatarTab = (
+
+
+
+ );
+ const UploadBoxTab = (
+
+
+
+
+
+
+
+
+ );
+
+ const TABS: TabsProps['items'] = [
+ { key: 'upload--file', label: 'Upload Single File', children: UploadFileTab },
+ { key: 'upload-avatar', label: 'Upload Avatar', children: UploadAvatarTab },
+ { key: 'upload-box', label: 'Upload Box', children: UploadBoxTab },
+ ];
+
+ return ;
+}
diff --git a/src/pages/dashboard/analysis/analysis-card.tsx b/src/pages/dashboard/analysis/analysis-card.tsx
new file mode 100644
index 0000000..7736ca6
--- /dev/null
+++ b/src/pages/dashboard/analysis/analysis-card.tsx
@@ -0,0 +1,23 @@
+import { CSSProperties } from 'react';
+
+type Props = {
+ cover: string;
+ subtitle: string;
+ title: string;
+ style?: CSSProperties;
+};
+
+export default function AnalysisCard({ cover, subtitle, title, style }: Props) {
+ return (
+
+
+
{title}
+
{subtitle}
+
+ );
+}
diff --git a/src/pages/dashboard/analysis/analysis-news.tsx b/src/pages/dashboard/analysis/analysis-news.tsx
new file mode 100644
index 0000000..c6b58d0
--- /dev/null
+++ b/src/pages/dashboard/analysis/analysis-news.tsx
@@ -0,0 +1,35 @@
+import { faker } from '@faker-js/faker';
+import { List, Avatar } from 'antd';
+
+const data = [
+ {
+ title: faker.lorem.words(),
+ },
+ {
+ title: faker.lorem.words(),
+ },
+ {
+ title: faker.lorem.words(),
+ },
+ {
+ title: faker.lorem.words(),
+ },
+];
+export default function AnalysisNews() {
+ return (
+ (
+
+ }
+ title={item.title}
+ description={faker.lorem.sentence()}
+ />
+
+ )}
+ />
+ );
+}
diff --git a/src/pages/dashboard/analysis/analysis-order-timeline.tsx b/src/pages/dashboard/analysis/analysis-order-timeline.tsx
new file mode 100644
index 0000000..c8abe6b
--- /dev/null
+++ b/src/pages/dashboard/analysis/analysis-order-timeline.tsx
@@ -0,0 +1,68 @@
+import { Timeline, Typography } from 'antd';
+
+import { useThemeToken } from '@/theme/hooks';
+
+export default function AnalysisOrderTimeline() {
+ const theme = useThemeToken();
+ return (
+
+ 1983, orders,$4220
+
+ 08 Oct 2023 7:19 PM
+
+
+ ),
+ },
+ {
+ color: theme.colorPrimaryActive,
+ children: (
+
+ 12 Invoices have been paid
+
+ 07 Oct 2023 6:19 PM
+
+
+ ),
+ },
+ {
+ color: theme.colorInfo,
+ children: (
+
+ Order #37745 from September
+
+ 06 Oct 2023 5:19 PM
+
+
+ ),
+ },
+ {
+ color: theme.colorWarning,
+ children: (
+
+ New order placed #XF-2356
+
+ 05 Oct 2023 4:19 PM
+
+
+ ),
+ },
+ {
+ color: theme.colorError,
+ children: (
+
+ New order placed #XF-2346
+
+ 04 Oct 2023 3:19 PM
+
+
+ ),
+ },
+ ]}
+ />
+ );
+}
diff --git a/src/pages/dashboard/analysis/analysis-tasks.tsx b/src/pages/dashboard/analysis/analysis-tasks.tsx
new file mode 100644
index 0000000..e2f381d
--- /dev/null
+++ b/src/pages/dashboard/analysis/analysis-tasks.tsx
@@ -0,0 +1,48 @@
+import { faker } from '@faker-js/faker';
+import { List, Checkbox } from 'antd';
+
+import { IconButton, Iconify } from '@/components/icon';
+
+export default function AnalysisTasks() {
+ const data = [
+ {
+ task: faker.lorem.words(),
+ checked: false,
+ },
+ {
+ task: faker.lorem.words(),
+ checked: true,
+ },
+ {
+ task: faker.lorem.words(),
+ checked: false,
+ },
+ {
+ task: faker.lorem.words(),
+ checked: false,
+ },
+ ];
+ return (
+ (
+
+
+ ,
+ ]}
+ >
+ {
+ item.checked = e.target.checked;
+ }}
+ >
+ {item.task}
+
+
+ )}
+ />
+ );
+}
diff --git a/src/pages/dashboard/analysis/analysis-traffic-card.tsx b/src/pages/dashboard/analysis/analysis-traffic-card.tsx
new file mode 100644
index 0000000..e044c40
--- /dev/null
+++ b/src/pages/dashboard/analysis/analysis-traffic-card.tsx
@@ -0,0 +1,27 @@
+import { ReactNode } from 'react';
+
+import { useThemeToken } from '@/theme/hooks';
+
+type Props = {
+ icon: ReactNode;
+ title: string;
+ subtitle: string;
+};
+
+export default function AnalysisTrafficCard({ icon, title, subtitle }: Props) {
+ const theme = useThemeToken();
+ return (
+
+
{icon}
+
{title}
+
+ {subtitle}
+
+
+ );
+}
diff --git a/src/pages/dashboard/analysis/index.tsx b/src/pages/dashboard/analysis/index.tsx
new file mode 100644
index 0000000..a4f6f3f
--- /dev/null
+++ b/src/pages/dashboard/analysis/index.tsx
@@ -0,0 +1,173 @@
+import { Card, Col, Row, Typography } from 'antd';
+import Color from 'color';
+
+import glass_bag from '@/assets/images/glass/ic_glass_bag.png';
+import glass_buy from '@/assets/images/glass/ic_glass_buy.png';
+import glass_message from '@/assets/images/glass/ic_glass_message.png';
+import glass_users from '@/assets/images/glass/ic_glass_users.png';
+import { Iconify } from '@/components/icon';
+import ChartBar from '@/pages/components/chart/view/chart-bar';
+import ChartMixed from '@/pages/components/chart/view/chart-mixed';
+import ChartPie from '@/pages/components/chart/view/chart-pie';
+import ChartRadar from '@/pages/components/chart/view/chart-radar';
+import { useThemeToken } from '@/theme/hooks';
+
+import AnalysisCard from './analysis-card';
+import AnalysisNews from './analysis-news';
+import AnalysisOrderTimeline from './analysis-order-timeline';
+import AnalysisTasks from './analysis-tasks';
+import AnalysisTrafficCard from './analysis-traffic-card';
+
+function Analysis() {
+ const theme = useThemeToken();
+ return (
+
+
Hi, Welcome back 👋
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ title="1.95k"
+ subtitle="FaceBook"
+ />
+
+
+
+ }
+ title="9.12k"
+ subtitle="Google"
+ />
+
+
+
+ }
+ title="6.98k"
+ subtitle="Linkedin"
+ />
+
+
+
+ }
+ title="8.49k"
+ subtitle="Twitter"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Analysis;
diff --git a/src/pages/dashboard/workbench/area-download.tsx b/src/pages/dashboard/workbench/area-download.tsx
new file mode 100644
index 0000000..a7d00cc
--- /dev/null
+++ b/src/pages/dashboard/workbench/area-download.tsx
@@ -0,0 +1,65 @@
+import { Select, Typography } from 'antd';
+import { useState } from 'react';
+
+import Card from '@/components/card';
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+export default function AreaDownload() {
+ const [year, setYear] = useState('2023');
+ const series: Record = {
+ '2022': [
+ { name: 'China', data: [10, 41, 35, 51, 49, 61, 69, 91, 148, 35, 51] },
+ { name: 'America', data: [10, 34, 13, 56, 77, 88, 99, 45, 13, 56, 77] },
+ ],
+
+ '2023': [
+ { name: 'China', data: [51, 35, 41, 10, 91, 69, 62, 148, 91, 35, 51] },
+ { name: 'America', data: [56, 13, 34, 10, 77, 99, 88, 45, 13, 56, 77] },
+ ],
+ };
+ return (
+
+
+ Area Installed
+ setYear(value)}
+ options={[
+ { value: 2023, label: '2023' },
+ { value: 2022, label: '2022' },
+ ]}
+ />
+
+
+
+
+
+ );
+}
+
+function ChartArea({ series }: { series: ApexAxisChartSeries }) {
+ const chartOptions = useChart({
+ xaxis: {
+ type: 'category',
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jut',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ },
+ tooltip: {},
+ });
+
+ return ;
+}
diff --git a/src/pages/dashboard/workbench/banner-card.tsx b/src/pages/dashboard/workbench/banner-card.tsx
new file mode 100644
index 0000000..8c1a80e
--- /dev/null
+++ b/src/pages/dashboard/workbench/banner-card.tsx
@@ -0,0 +1,269 @@
+import { Col, Row } from 'antd';
+import Color from 'color';
+
+import Character3 from '@/assets/images/characters/character_3.png';
+import { Iconify } from '@/components/icon';
+import { useUserInfo } from '@/store/userStore';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function BannerCard() {
+ const { username } = useUserInfo();
+ const themeToken = useThemeToken();
+
+ const bg = `linear-gradient(135deg, ${Color(themeToken.colorPrimaryHover).alpha(0.2)}, ${Color(
+ themeToken.colorPrimary,
+ ).alpha(0.2)}) rgb(255, 255, 255)`;
+
+ return (
+
+
+
+
Welcome back 👋
+ {username}
+
+
+ Welcome to join the Discord channel to discuss everything about aelfscan AD management
+ background, or you can visite my blog:
+
+
+ window.open('https://discord.gg/fXemAXVNDa')}
+ >
+
+ Join Discord
+
+
+
+
+
+
+
+ );
+}
+
+function BannerSvg() {
+ const { colorPrimary, colorPrimaryActive, colorPrimaryHover } = useThemeToken();
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/carousel-card.tsx b/src/pages/dashboard/workbench/carousel-card.tsx
new file mode 100644
index 0000000..1aa59cd
--- /dev/null
+++ b/src/pages/dashboard/workbench/carousel-card.tsx
@@ -0,0 +1,28 @@
+import { Carousel } from 'antd';
+
+export default function CarouselCard() {
+ const contentStyle: React.CSSProperties = {
+ margin: 0,
+ height: '160px',
+ color: '#000000',
+ lineHeight: '160px',
+ textAlign: 'center',
+ background: '#364d79',
+ };
+ return (
+
+
+
1
+
+
+
2
+
+
+
3
+
+
+
4
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/conversion_applications.tsx b/src/pages/dashboard/workbench/conversion_applications.tsx
new file mode 100644
index 0000000..b7ebaab
--- /dev/null
+++ b/src/pages/dashboard/workbench/conversion_applications.tsx
@@ -0,0 +1,65 @@
+import { Progress } from 'antd';
+
+import { Iconify } from '@/components/icon';
+import { useThemeToken } from '@/theme/hooks';
+
+export function Conversion() {
+ const { colorPrimaryActive, colorPrimaryBorder } = useThemeToken();
+ return (
+
+ );
+}
+export function Applications() {
+ const { colorInfoActive, colorInfoBorder } = useThemeToken();
+ return (
+
+ );
+}
+
+type Props = {
+ percent: number;
+ title: string;
+ subtitle: string;
+ iconify: string;
+ bg?: string;
+ strokeColor?: string;
+};
+function Basic({ percent, title, subtitle, iconify, bg, strokeColor }: Props) {
+ const { colorBgBase } = useThemeToken();
+ const format = (val?: number) => {val}% ;
+ return (
+
+
+
+ {title}
+ {subtitle}
+
+
+
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/current-download.tsx b/src/pages/dashboard/workbench/current-download.tsx
new file mode 100644
index 0000000..2198a9b
--- /dev/null
+++ b/src/pages/dashboard/workbench/current-download.tsx
@@ -0,0 +1,56 @@
+import { Typography } from 'antd';
+
+import Card from '@/components/card';
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+
+export default function CurrentDownload() {
+ return (
+
+
+
+
+
+
+ );
+}
+
+const series = [44, 55, 13, 43];
+function ChartDonut() {
+ const chartOptions = useChart({
+ labels: ['Mac', 'Window', 'IOS', 'Android'],
+ stroke: {
+ show: false,
+ },
+ legend: {
+ position: 'bottom',
+ horizontalAlign: 'center',
+ },
+ tooltip: {
+ fillSeriesColor: false,
+ },
+ chart: {
+ width: 240,
+ },
+ plotOptions: {
+ pie: {
+ donut: {
+ size: '90%',
+ labels: {
+ total: {
+ fontSize: '12px',
+ },
+ value: {
+ fontSize: '18px',
+ fontWeight: 700,
+ },
+ },
+ },
+ },
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/dashboard/workbench/index.tsx b/src/pages/dashboard/workbench/index.tsx
new file mode 100644
index 0000000..7f35db2
--- /dev/null
+++ b/src/pages/dashboard/workbench/index.tsx
@@ -0,0 +1,91 @@
+import { Col, Row, Space } from 'antd';
+
+import AreaDownload from './area-download';
+import BannerCard from './banner-card';
+import { Applications, Conversion } from './conversion_applications';
+import CurrentDownload from './current-download';
+import NewInvoice from './new-invoice';
+import TopAuthor from './top-authors';
+import TopInstalled from './top-installed';
+import TopRelated from './top-related';
+import TotalCard from './total-card';
+
+function Workbench() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Workbench;
diff --git a/src/pages/dashboard/workbench/new-invoice.tsx b/src/pages/dashboard/workbench/new-invoice.tsx
new file mode 100644
index 0000000..1ebc0e8
--- /dev/null
+++ b/src/pages/dashboard/workbench/new-invoice.tsx
@@ -0,0 +1,111 @@
+import { Space, Typography } from 'antd';
+import Table, { ColumnsType } from 'antd/es/table';
+
+import Card from '@/components/card';
+import { IconButton, Iconify } from '@/components/icon';
+import Scrollbar from '@/components/scrollbar';
+import ProTag from '@/theme/antd/components/tag';
+
+interface DataType {
+ key: string;
+ id: string;
+ category: string;
+ price: string;
+ status: string;
+}
+
+export default function NewInvoice() {
+ const columns: ColumnsType = [
+ {
+ title: 'InvoiceId',
+ dataIndex: 'id',
+ key: 'id',
+ render: (text) => {text} ,
+ },
+ {
+ title: 'Category',
+ dataIndex: 'category',
+ key: 'category',
+ },
+ {
+ title: 'Price',
+ dataIndex: 'price',
+ key: 'price',
+ render: (text) => {text} ,
+ },
+ {
+ title: 'Status',
+ key: 'status',
+ dataIndex: 'status',
+ render: (_status) => {
+ const status = _status as string;
+ let color = 'success';
+ if (status === 'Progress') color = 'gold';
+ if (status === 'Out of Date') color = 'red';
+ return {status} ;
+ },
+ },
+ {
+ title: 'Action',
+ key: 'action',
+ render: () => (
+
+
+
+
+
+ ),
+ },
+ ];
+
+ const data: DataType[] = [
+ {
+ key: '1',
+ id: 'INV-1990',
+ category: 'Android',
+ price: '$83.74',
+ status: 'Paid',
+ },
+ {
+ key: '2',
+ id: 'INV-1991',
+ category: 'Mac',
+ price: '$97.14',
+ status: 'Out of Date',
+ },
+ {
+ key: '3',
+ id: 'INV-1992',
+ category: 'Windows',
+ price: '$68.71',
+ status: 'Progress',
+ },
+ {
+ key: '4',
+ id: 'INV-1993',
+ category: 'Android',
+ price: '$85.21',
+ status: 'Paid',
+ },
+ {
+ key: '5',
+ id: 'INV-1994',
+ category: 'Mac',
+ price: '$53.17',
+ status: 'Paid',
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/top-authors.tsx b/src/pages/dashboard/workbench/top-authors.tsx
new file mode 100644
index 0000000..d4d5d67
--- /dev/null
+++ b/src/pages/dashboard/workbench/top-authors.tsx
@@ -0,0 +1,65 @@
+import { faker } from '@faker-js/faker';
+import { Typography } from 'antd';
+import Color from 'color';
+
+import Card from '@/components/card';
+import { Iconify } from '@/components/icon';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function TopAuthor() {
+ const themeToken = useThemeToken();
+ const getTrophyIconColor = (index: number) => {
+ switch (index) {
+ case 1:
+ return {
+ color: themeToken.colorInfo,
+ bg: themeToken.colorInfoBgHover,
+ };
+ case 2: {
+ return {
+ color: themeToken.colorError,
+ bg: themeToken.colorErrorBgHover,
+ };
+ }
+ default:
+ return {
+ color: themeToken.colorPrimary,
+ bg: themeToken.colorPrimaryBgHover,
+ };
+ }
+ };
+ return (
+
+
+
+ {new Array(3).fill('').map((_, index) => (
+
+
+
+
{faker.person.fullName()}
+
+
+ {faker.number.float({ min: 3, max: 9 })}k
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/top-installed.tsx b/src/pages/dashboard/workbench/top-installed.tsx
new file mode 100644
index 0000000..b9bb298
--- /dev/null
+++ b/src/pages/dashboard/workbench/top-installed.tsx
@@ -0,0 +1,89 @@
+import { Typography } from 'antd';
+import { ReactNode } from 'react';
+
+import Card from '@/components/card';
+import { Iconify } from '@/components/icon';
+
+const dataSource = [
+ {
+ country: 'Germany',
+ iconify: 'twemoji:flag-germany',
+ android: '9.91k',
+ windows: '1.95k',
+ ios: '1.95k',
+ },
+ {
+ country: 'China',
+ iconify: 'twemoji:flag-china',
+ android: '1.95k',
+ windows: '9.25k',
+ ios: '7.95k',
+ },
+ {
+ country: 'Australia',
+ iconify: 'twemoji:flag-australia',
+ android: '3.91k',
+ windows: '2.95k',
+ ios: '4.95k',
+ },
+ {
+ country: 'France',
+ iconify: 'twemoji:flag-france',
+ android: '3.28k',
+ windows: '2.29k',
+ ios: '8.95k',
+ },
+ {
+ country: 'USA',
+ iconify: 'twemoji:flag-united-states',
+ android: '8.81k',
+ windows: '7.05k',
+ ios: '4.35k',
+ },
+];
+
+const platformIcon = (platform: string) => {
+ let iconify: ReactNode;
+ if (platform === 'android') {
+ iconify = ;
+ }
+ if (platform === 'windows') {
+ iconify = ;
+ }
+ iconify = ;
+
+ return {iconify}
;
+};
+export default function TopInstalled() {
+ return (
+
+
+ Top Installed Countries
+
+
+ {dataSource.map((item) => (
+
+
+
{item.country}
+
+
+ {platformIcon('android')}
+ {item.android}
+
+
+
+ {platformIcon('windows')}
+ {item.windows}
+
+
+
+ {platformIcon('ios')}
+ {item.ios}
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/top-related.tsx b/src/pages/dashboard/workbench/top-related.tsx
new file mode 100644
index 0000000..6b95c79
--- /dev/null
+++ b/src/pages/dashboard/workbench/top-related.tsx
@@ -0,0 +1,98 @@
+import { Typography } from 'antd';
+
+import Card from '@/components/card';
+import { Iconify } from '@/components/icon';
+import Scrollbar from '@/components/scrollbar';
+import ProRate from '@/theme/antd/components/rage';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+const dataSource = [
+ {
+ logo: ,
+ title: 'Chrome',
+ platform: 'Mac',
+ type: 'free',
+ star: 4,
+ reviews: '9.91k',
+ },
+ {
+ logo: ,
+ title: 'Drive',
+ platform: 'Mac',
+ type: 'free',
+ star: 3.5,
+ reviews: '1.95k',
+ },
+ {
+ logo: ,
+ title: 'Dropbox',
+ platform: 'Windows',
+ type: '$66.71',
+ star: 4.5,
+ reviews: '9.12k',
+ },
+ {
+ logo: ,
+ title: 'Slack',
+ platform: 'Mac',
+ type: 'free',
+ star: 3.5,
+ reviews: '6.98k',
+ },
+ {
+ logo: ,
+ title: 'Discord',
+ platform: 'Windows',
+ type: '$52.17',
+ star: 0.5,
+ reviews: '8.49k',
+ },
+];
+export default function TopRelated() {
+ const themeToken = useThemeToken();
+ return (
+
+
+ Top Related Applications
+
+
+
+ {dataSource.map((item) => (
+
+
+ {item.logo}
+
+
+
+
{item.title}
+
+ {item.platform === 'Mac' ? (
+
+ ) : (
+
+ )}
+
{item.platform}
+
{item.type}
+
+
+
+
+
+
{item.reviews}reviews
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/pages/dashboard/workbench/total-card.tsx b/src/pages/dashboard/workbench/total-card.tsx
new file mode 100644
index 0000000..faeb3b7
--- /dev/null
+++ b/src/pages/dashboard/workbench/total-card.tsx
@@ -0,0 +1,79 @@
+import Card from '@/components/card';
+import Chart from '@/components/chart/chart';
+import useChart from '@/components/chart/useChart';
+import { SvgIcon } from '@/components/icon';
+
+type Props = {
+ title: string;
+ increase: boolean;
+ percent: string;
+ count: string;
+ chartData: number[];
+};
+export default function TotalCard({ title, increase, count, percent, chartData }: Props) {
+ return (
+
+
+
{title}
+
+ {increase ? (
+
+ ) : (
+
+ )}
+
+ {increase ? '+' : '-'}
+ {percent}
+
+
+
{count}
+
+
+
+
+ );
+}
+
+function ChartLine({ data }: { data: number[] }) {
+ const series = [
+ {
+ name: '',
+ data,
+ },
+ ];
+ const chartOptions = useChart({
+ tooltip: {
+ x: {
+ show: false,
+ },
+ },
+ xaxis: {
+ labels: {
+ show: false,
+ showDuplicates: false,
+ },
+ tooltip: {
+ enabled: false,
+ },
+ crosshairs: {
+ show: false,
+ },
+ },
+ yaxis: {
+ labels: {
+ show: false,
+ },
+ tooltip: {
+ enabled: false,
+ },
+ crosshairs: {
+ show: false,
+ },
+ },
+ grid: {
+ show: false,
+ },
+ });
+
+ return ;
+}
diff --git a/src/pages/functions/clipboard/index.tsx b/src/pages/functions/clipboard/index.tsx
new file mode 100644
index 0000000..5d25e29
--- /dev/null
+++ b/src/pages/functions/clipboard/index.tsx
@@ -0,0 +1,37 @@
+import { faker } from '@faker-js/faker';
+import { Card, Row, Col, Input, Tooltip, Typography } from 'antd';
+import { ChangeEvent, useState } from 'react';
+
+import { IconButton, Iconify } from '@/components/icon';
+import { useCopyToClipboard } from '@/hooks/event/use-copy-to-clipboard';
+
+export default function ClipboardPage() {
+ const { copyFn } = useCopyToClipboard();
+
+ const [value, setValue] = useState('https://www.npmjs.com/package/');
+
+ const textOnClick = faker.lorem.paragraphs({ min: 3, max: 5 });
+
+ const handleChange = (e: ChangeEvent) => setValue(e.target.value);
+ const CopyButton = (
+
+ copyFn(value)}>
+
+
+
+ );
+ return (
+
+
+
+ ON CHANGE
+
+
+
+ ON DOUBLE CLICK
+ copyFn(textOnClick)}>{textOnClick}
+
+
+
+ );
+}
diff --git a/src/pages/functions/token-expired/index.tsx b/src/pages/functions/token-expired/index.tsx
new file mode 100644
index 0000000..df0acb6
--- /dev/null
+++ b/src/pages/functions/token-expired/index.tsx
@@ -0,0 +1,29 @@
+import { useMutation } from '@tanstack/react-query';
+import { Card, Row, Col, Typography, Button } from 'antd';
+
+import demoService from '@/api/services/demoService';
+
+export default function TokenExpired() {
+ const tokenExpiredMutation = useMutation({
+ mutationFn: demoService.mockTokenExpired,
+ });
+ const mockTokenExpired = () => {
+ tokenExpiredMutation.mutate();
+ };
+ return (
+
+
+
+
+ Clicking a button to simulate a token expiration scenario.
+
+
+
+
+ Simulate Token Expired
+
+
+
+
+ );
+}
diff --git a/src/pages/management/blog/index.tsx b/src/pages/management/blog/index.tsx
new file mode 100644
index 0000000..bd8bd49
--- /dev/null
+++ b/src/pages/management/blog/index.tsx
@@ -0,0 +1,5 @@
+function Blog() {
+ return Blog
;
+}
+
+export default Blog;
diff --git a/src/pages/management/system/organization/index.tsx b/src/pages/management/system/organization/index.tsx
new file mode 100644
index 0000000..90dbc4e
--- /dev/null
+++ b/src/pages/management/system/organization/index.tsx
@@ -0,0 +1,230 @@
+import { useQuery } from '@tanstack/react-query';
+import {
+ Button,
+ Card,
+ Col,
+ Form,
+ Input,
+ InputNumber,
+ Modal,
+ Popconfirm,
+ Radio,
+ Row,
+ Select,
+ Space,
+} from 'antd';
+import Table, { ColumnsType } from 'antd/es/table';
+import { TableRowSelection } from 'antd/es/table/interface';
+import { useEffect, useState } from 'react';
+
+import orgService from '@/api/services/orgService';
+import { IconButton, Iconify } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+
+import OrganizationChart from './organization-chart';
+
+import { Organization } from '#/entity';
+
+type SearchFormFieldType = Pick;
+
+export default function OrganizationPage() {
+ const [searchForm] = Form.useForm();
+ const [organizationModalPros, setOrganizationModalProps] = useState({
+ formValue: {
+ id: '',
+ name: '',
+ status: 'enable',
+ },
+ title: 'New',
+ show: false,
+ onOk: () => {
+ setOrganizationModalProps((prev) => ({ ...prev, show: false }));
+ },
+ onCancel: () => {
+ setOrganizationModalProps((prev) => ({ ...prev, show: false }));
+ },
+ });
+
+ const columns: ColumnsType = [
+ { title: 'Name', dataIndex: 'name', width: 300 },
+ { title: 'Order', dataIndex: 'order', align: 'center', width: 60 },
+ {
+ title: 'Status',
+ dataIndex: 'status',
+ align: 'center',
+ width: 120,
+ render: (status) => (
+ {status}
+ ),
+ },
+ { title: 'Desc', dataIndex: 'desc', align: 'center', width: 300 },
+ {
+ title: 'Action',
+ key: 'operation',
+ align: 'center',
+ width: 100,
+ render: (_, record) => (
+
+
onEdit(record)}>
+
+
+
+
+
+
+
+
+ ),
+ },
+ ];
+
+ // rowSelection objects indicates the need for row selection
+ const rowSelection: TableRowSelection = {
+ onChange: (selectedRowKeys, selectedRows) => {
+ console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
+ },
+ onSelect: (record, selected, selectedRows) => {
+ console.log(record, selected, selectedRows);
+ },
+ onSelectAll: (selected, selectedRows, changeRows) => {
+ console.log(selected, selectedRows, changeRows);
+ },
+ };
+
+ const { data } = useQuery({
+ queryKey: ['orgs'],
+ queryFn: orgService.getOrgList,
+ });
+
+ const onSearchFormReset = () => {
+ searchForm.resetFields();
+ };
+
+ const onCreate = () => {
+ setOrganizationModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Create New',
+ formValue: {
+ ...prev.formValue,
+ id: '',
+ name: '',
+ order: 1,
+ desc: '',
+ status: 'enable',
+ },
+ }));
+ };
+
+ const onEdit = (formValue: Organization) => {
+ setOrganizationModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Edit',
+ formValue,
+ }));
+ };
+
+ return (
+
+
+
+
+
+
+ New
+
+ }
+ >
+
+
+
+
+
+
+
+
+
+ );
+}
+
+type OrganizationModalProps = {
+ formValue: Organization;
+ title: string;
+ show: boolean;
+ onOk: VoidFunction;
+ onCancel: VoidFunction;
+};
+
+function OrganizationModal({ title, show, formValue, onOk, onCancel }: OrganizationModalProps) {
+ const [form] = Form.useForm();
+ useEffect(() => {
+ form.setFieldsValue({ ...formValue });
+ }, [formValue, form]);
+ return (
+
+ label="Name" name="name" required>
+
+
+ label="Order" name="order" required>
+
+
+ label="Status" name="status" required>
+
+ Enable
+ Disable
+
+
+ label="Desc" name="desc">
+
+
+
+
+ );
+}
diff --git a/src/pages/management/system/organization/organization-chart.tsx b/src/pages/management/system/organization/organization-chart.tsx
new file mode 100644
index 0000000..fbcff06
--- /dev/null
+++ b/src/pages/management/system/organization/organization-chart.tsx
@@ -0,0 +1,94 @@
+import Color from 'color';
+import { Tree, TreeNode } from 'react-organizational-chart';
+import styled from 'styled-components';
+
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import { Organization } from '#/entity';
+import { ThemeMode } from '#/enum';
+
+type Props = {
+ organizations?: Organization[];
+};
+export default function OrganizationChart({ organizations = [] }: Props) {
+ const themeToken = useThemeToken();
+ const { themeMode } = useSettings();
+ return (
+
+ Root
+
+ }
+ >
+ {organizations.map((org) => (
+
+ ))}
+
+ );
+}
+
+type OrganizationChartTreeNodeProps = {
+ organization: Organization;
+};
+function OrganizationChartTreeNode({
+ organization: { name, children },
+}: OrganizationChartTreeNodeProps) {
+ const themeToken = useThemeToken();
+ const { themeMode } = useSettings();
+
+ return (
+
+ {name}
+
+ }
+ >
+ {children?.map((org) => (
+
+ ))}
+
+ );
+}
+
+type StyledNodeProps = {
+ $textColor: string;
+ $backgroundColor: string;
+ $borderColor: string;
+};
+const StyledNode = styled.div`
+ transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
+ overflow: hidden;
+ position: relative;
+ z-index: 0;
+ padding: 16px;
+ border-radius: 12px;
+ display: inline-flex;
+ text-transform: capitalize;
+ color: ${(props) => props.$textColor};
+ background-color: ${(props) => props.$backgroundColor};
+ border: 1px solid ${(props) => props.$borderColor};
+`;
diff --git a/src/pages/management/system/permission/index.tsx b/src/pages/management/system/permission/index.tsx
new file mode 100644
index 0000000..d324f15
--- /dev/null
+++ b/src/pages/management/system/permission/index.tsx
@@ -0,0 +1,148 @@
+import { Button, Card, Popconfirm } from 'antd';
+import Table, { ColumnsType } from 'antd/es/table';
+import { isNil } from 'ramda';
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { IconButton, Iconify, SvgIcon } from '@/components/icon';
+import { useUserPermission } from '@/store/userStore';
+import ProTag from '@/theme/antd/components/tag';
+
+import PermissionModal, { type PermissionModalProps } from './permission-modal';
+
+import { Permission } from '#/entity';
+import { BasicStatus, PermissionType } from '#/enum';
+
+const defaultPermissionValue: Permission = {
+ id: '',
+ parentId: '',
+ name: '',
+ label: '',
+ route: '',
+ component: '',
+ icon: '',
+ hide: false,
+ status: BasicStatus.ENABLE,
+ type: PermissionType.CATALOGUE,
+};
+export default function PermissionPage() {
+ const permissions = useUserPermission();
+ const { t } = useTranslation();
+
+ const [permissionModalProps, setPermissionModalProps] = useState({
+ formValue: { ...defaultPermissionValue },
+ title: 'New',
+ show: false,
+ onOk: () => {
+ setPermissionModalProps((prev) => ({ ...prev, show: false }));
+ },
+ onCancel: () => {
+ setPermissionModalProps((prev) => ({ ...prev, show: false }));
+ },
+ });
+ const columns: ColumnsType = [
+ {
+ title: 'Name',
+ dataIndex: 'name',
+ width: 300,
+ render: (_, record) => {t(record.label)}
,
+ },
+ {
+ title: 'Type',
+ dataIndex: 'type',
+ width: 60,
+ render: (_, record) => {PermissionType[record.type]} ,
+ },
+ {
+ title: 'Icon',
+ dataIndex: 'icon',
+ width: 60,
+ render: (icon: string) => {
+ if (isNil(icon)) return '';
+ if (icon.startsWith('ic')) {
+ return ;
+ }
+ return ;
+ },
+ },
+ {
+ title: 'Component',
+ dataIndex: 'component',
+ },
+ {
+ title: 'Status',
+ dataIndex: 'status',
+ align: 'center',
+ width: 120,
+ render: (status) => (
+
+ {status === BasicStatus.DISABLE ? 'Disable' : 'Enable'}
+
+ ),
+ },
+ { title: 'Order', dataIndex: 'order', width: 60 },
+ {
+ title: 'Action',
+ key: 'operation',
+ align: 'center',
+ width: 100,
+ render: (_, record) => (
+
+ {record?.type === PermissionType.CATALOGUE && (
+
onCreate(record.id)}>
+
+
+ )}
+
onEdit(record)}>
+
+
+
+
+
+
+
+
+ ),
+ },
+ ];
+
+ const onCreate = (parentId?: string) => {
+ setPermissionModalProps((prev) => ({
+ ...prev,
+ show: true,
+ ...defaultPermissionValue,
+ title: 'New',
+ formValue: { ...defaultPermissionValue, parentId: parentId ?? '' },
+ }));
+ };
+
+ const onEdit = (formValue: Permission) => {
+ setPermissionModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Edit',
+ formValue,
+ }));
+ };
+ return (
+ onCreate()}>
+ New
+
+ }
+ >
+
+
+
+
+ );
+}
diff --git a/src/pages/management/system/permission/permission-modal.tsx b/src/pages/management/system/permission/permission-modal.tsx
new file mode 100644
index 0000000..68e3ae3
--- /dev/null
+++ b/src/pages/management/system/permission/permission-modal.tsx
@@ -0,0 +1,161 @@
+import { AutoComplete, Form, Input, InputNumber, Modal, Radio, TreeSelect } from 'antd';
+import { useCallback, useEffect, useState } from 'react';
+
+import { pagesSelect } from '@/router/hooks/use-permission-routes';
+import { useUserPermission } from '@/store/userStore';
+
+import { Permission } from '#/entity';
+import { BasicStatus, PermissionType } from '#/enum';
+
+export type PermissionModalProps = {
+ formValue: Permission;
+ title: string;
+ show: boolean;
+ onOk: VoidFunction;
+ onCancel: VoidFunction;
+};
+
+export default function PermissionModal({
+ title,
+ show,
+ formValue,
+ onOk,
+ onCancel,
+}: PermissionModalProps) {
+ const [form] = Form.useForm();
+ const permissions = useUserPermission();
+ const [compOptions, setCompOptions] = useState(pagesSelect);
+
+ const getParentNameById = useCallback(
+ (parentId: string, data: Permission[] | undefined = permissions) => {
+ let name = '';
+ if (!data || !parentId) return name;
+ for (let i = 0; i < data.length; i += 1) {
+ if (data[i].id === parentId) {
+ name = data[i].name;
+ } else if (data[i].children) {
+ name = getParentNameById(parentId, data[i].children);
+ }
+ if (name) {
+ break;
+ }
+ }
+ return name;
+ },
+ [permissions],
+ );
+
+ const updateCompOptions = (name: string) => {
+ setCompOptions(
+ pagesSelect.filter((path) => {
+ return path.value.includes(name.toLowerCase());
+ }),
+ );
+ };
+
+ useEffect(() => {
+ form.setFieldsValue({ ...formValue });
+ if (formValue.parentId) {
+ const parentName = getParentNameById(formValue.parentId);
+ updateCompOptions(parentName);
+ }
+ }, [formValue, form, getParentNameById]);
+
+ return (
+
+ label="Type" name="type" required>
+
+ CATALOGUE
+ MENU
+
+
+
+ label="Name" name="name" required>
+
+
+
+
+ label="Label"
+ name="label"
+ required
+ tooltip="internationalization config"
+ >
+
+
+
+ label="Parent" name="parentId" required>
+ {
+ updateCompOptions(labelList[0] as string);
+ }}
+ />
+
+
+ label="Route" name="route" required>
+
+
+
+ prevValues.type !== currentValues.type}
+ >
+ {({ getFieldValue }) => {
+ if (getFieldValue('type') === PermissionType.MENU) {
+ return (
+
+ label="Component"
+ name="component"
+ required={getFieldValue('type') === PermissionType.MENU}
+ >
+
+ ((option?.label || '') as string).toLowerCase().includes(input.toLowerCase())
+ }
+ />
+
+ );
+ }
+ return null;
+ }}
+
+
+ label="Icon" name="icon" tooltip="local icon should start with ic">
+
+
+
+ label="Hide" name="hide" tooltip="hide in menu">
+
+ Show
+ Hide
+
+
+
+ label="Order" name="order">
+
+
+
+ label="Status" name="status" required>
+
+ Enable
+ Disable
+
+
+
+
+ );
+}
diff --git a/src/pages/management/system/role/index.tsx b/src/pages/management/system/role/index.tsx
new file mode 100644
index 0000000..f57fc6c
--- /dev/null
+++ b/src/pages/management/system/role/index.tsx
@@ -0,0 +1,120 @@
+import { Button, Card, Popconfirm } from 'antd';
+import Table, { ColumnsType } from 'antd/es/table';
+import { useState } from 'react';
+
+import { ROLE_LIST } from '@/_mock/assets';
+import { IconButton, Iconify } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+
+import { RoleModal, RoleModalProps } from './role-modal';
+
+import { Role } from '#/entity';
+import { BasicStatus } from '#/enum';
+
+const ROLES: Role[] = ROLE_LIST;
+
+const DEFAULE_ROLE_VALUE: Role = {
+ id: '',
+ name: '',
+ label: '',
+ status: BasicStatus.ENABLE,
+ permission: [],
+};
+export default function RolePage() {
+ const [roleModalPros, setRoleModalProps] = useState({
+ formValue: { ...DEFAULE_ROLE_VALUE },
+ title: 'New',
+ show: false,
+ onOk: () => {
+ setRoleModalProps((prev) => ({ ...prev, show: false }));
+ },
+ onCancel: () => {
+ setRoleModalProps((prev) => ({ ...prev, show: false }));
+ },
+ });
+ const columns: ColumnsType = [
+ {
+ title: 'Name',
+ dataIndex: 'name',
+ width: 300,
+ },
+ {
+ title: 'Label',
+ dataIndex: 'label',
+ },
+ { title: 'Order', dataIndex: 'order', width: 60 },
+ {
+ title: 'Status',
+ dataIndex: 'status',
+ align: 'center',
+ width: 120,
+ render: (status) => (
+
+ {status === BasicStatus.DISABLE ? 'Disable' : 'Enable'}
+
+ ),
+ },
+ { title: 'Desc', dataIndex: 'desc' },
+ {
+ title: 'Action',
+ key: 'operation',
+ align: 'center',
+ width: 100,
+ render: (_, record) => (
+
+
onEdit(record)}>
+
+
+
+
+
+
+
+
+ ),
+ },
+ ];
+
+ const onCreate = () => {
+ setRoleModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Create New',
+ formValue: {
+ ...prev.formValue,
+ ...DEFAULE_ROLE_VALUE,
+ },
+ }));
+ };
+
+ const onEdit = (formValue: Role) => {
+ setRoleModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Edit',
+ formValue,
+ }));
+ };
+
+ return (
+
+ New
+
+ }
+ >
+
+
+
+
+ );
+}
diff --git a/src/pages/management/system/role/role-modal.tsx b/src/pages/management/system/role/role-modal.tsx
new file mode 100644
index 0000000..e205079
--- /dev/null
+++ b/src/pages/management/system/role/role-modal.tsx
@@ -0,0 +1,74 @@
+import { Form, Modal, Input, InputNumber, Radio, Tree } from 'antd';
+import { useEffect } from 'react';
+
+import { PERMISSION_LIST } from '@/_mock/assets';
+import { flattenTrees } from '@/utils/tree';
+
+import { Permission, Role } from '#/entity';
+import { BasicStatus } from '#/enum';
+
+export type RoleModalProps = {
+ formValue: Role;
+ title: string;
+ show: boolean;
+ onOk: VoidFunction;
+ onCancel: VoidFunction;
+};
+const PERMISSIONS: Permission[] = PERMISSION_LIST;
+export function RoleModal({ title, show, formValue, onOk, onCancel }: RoleModalProps) {
+ const [form] = Form.useForm();
+
+ const flattenedPermissions = flattenTrees(formValue.permission);
+ const checkedKeys = flattenedPermissions.map((item) => item.id);
+ useEffect(() => {
+ form.setFieldsValue({ ...formValue });
+ }, [formValue, form]);
+
+ return (
+
+ label="Name" name="name" required>
+
+
+
+ label="Label" name="label" required>
+
+
+
+ label="Order" name="order">
+
+
+
+ label="Status" name="status" required>
+
+ Enable
+ Disable
+
+
+
+ label="Desc" name="desc">
+
+
+
+ label="Permission" name="permission">
+
+
+
+
+ );
+}
diff --git a/src/pages/management/system/user/detail.tsx b/src/pages/management/system/user/detail.tsx
new file mode 100644
index 0000000..a7fde9e
--- /dev/null
+++ b/src/pages/management/system/user/detail.tsx
@@ -0,0 +1,17 @@
+import { USER_LIST } from '@/_mock/assets';
+import Card from '@/components/card';
+import { useParams } from '@/router/hooks';
+
+import type { UserInfo } from '#/entity';
+
+const USERS: UserInfo[] = USER_LIST;
+
+export default function UserDetail() {
+ const { id } = useParams();
+ const user = USERS.find((user) => user.id === id);
+ return (
+
+ {user?.username}
+
+ );
+}
diff --git a/src/pages/management/system/user/index.tsx b/src/pages/management/system/user/index.tsx
new file mode 100644
index 0000000..cb4d3da
--- /dev/null
+++ b/src/pages/management/system/user/index.tsx
@@ -0,0 +1,103 @@
+import { Button, Card, Popconfirm } from 'antd';
+import Table, { ColumnsType } from 'antd/es/table';
+
+import { USER_LIST } from '@/_mock/assets';
+import { IconButton, Iconify } from '@/components/icon';
+import { usePathname, useRouter } from '@/router/hooks';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+import type { Role, UserInfo } from '#/entity';
+import { BasicStatus } from '#/enum';
+
+const USERS: UserInfo[] = USER_LIST;
+
+export default function RolePage() {
+ const { colorTextSecondary } = useThemeToken();
+ const { push } = useRouter();
+ const pathname = usePathname();
+
+ const columns: ColumnsType = [
+ {
+ title: 'Name',
+ dataIndex: 'name',
+ width: 300,
+ render: (_, record) => {
+ return (
+
+
+
+ {record.username}
+
+ {record.email}
+
+
+
+ );
+ },
+ },
+ {
+ title: 'Role',
+ dataIndex: 'role',
+ align: 'center',
+ width: 120,
+ render: (role: Role) => {role.name} ,
+ },
+ {
+ title: 'Status',
+ dataIndex: 'status',
+ align: 'center',
+ width: 120,
+ render: (status) => (
+
+ {status === BasicStatus.DISABLE ? 'Disable' : 'Enable'}
+
+ ),
+ },
+ {
+ title: 'Action',
+ key: 'operation',
+ align: 'center',
+ width: 100,
+ render: (_, record) => (
+
+
{
+ push(`${pathname}/${record.id}`);
+ }}
+ >
+
+
+
{}}>
+
+
+
+
+
+
+
+
+ ),
+ },
+ ];
+
+ return (
+ {}}>
+ New
+
+ }
+ >
+
+
+ );
+}
diff --git a/src/pages/management/user/account/general-tab.tsx b/src/pages/management/user/account/general-tab.tsx
new file mode 100644
index 0000000..110d824
--- /dev/null
+++ b/src/pages/management/user/account/general-tab.tsx
@@ -0,0 +1,112 @@
+import { faker } from '@faker-js/faker';
+import { App, Button, Col, Form, Input, Row, Space, Switch } from 'antd';
+
+import Card from '@/components/card';
+import { UploadAvatar } from '@/components/upload';
+import { useUserInfo } from '@/store/userStore';
+
+type FieldType = {
+ name?: string;
+ email?: string;
+ phone?: string;
+ address?: string;
+ city?: string;
+ code?: string;
+ about: string;
+};
+export default function GeneralTab() {
+ const { notification } = App.useApp();
+ const { avatar, username, email } = useUserInfo();
+ const initFormValues = {
+ name: username,
+ email,
+ phone: faker.phone.number(),
+ address: faker.location.county(),
+ city: faker.location.city(),
+ code: faker.location.zipCode(),
+ about: faker.lorem.paragraphs(),
+ };
+ const handleClick = () => {
+ notification.success({
+ message: 'Update success!',
+ duration: 3,
+ });
+ };
+ return (
+
+
+
+
+
+
+ Public Profile
+
+
+
+
+ Delete User
+
+
+
+
+
+ label="About" name="about">
+
+
+
+
+
+ Save Changes
+
+
+
+
+
+
+ );
+}
diff --git a/src/pages/management/user/account/index.tsx b/src/pages/management/user/account/index.tsx
new file mode 100644
index 0000000..1345855
--- /dev/null
+++ b/src/pages/management/user/account/index.tsx
@@ -0,0 +1,46 @@
+import { Tabs, TabsProps } from 'antd';
+
+import { Iconify } from '@/components/icon';
+
+import GeneralTab from './general-tab';
+import NotificationsTab from './notifications-tab';
+import SecurityTab from './security-tab';
+
+function UserAccount() {
+ const items: TabsProps['items'] = [
+ {
+ key: '1',
+ label: (
+
+
+ General
+
+ ),
+ children: ,
+ },
+ {
+ key: '2',
+ label: (
+
+
+ Notifications
+
+ ),
+ children: ,
+ },
+ {
+ key: '3',
+ label: (
+
+
+ Security
+
+ ),
+ children: ,
+ },
+ ];
+
+ return ;
+}
+
+export default UserAccount;
diff --git a/src/pages/management/user/account/notifications-tab.tsx b/src/pages/management/user/account/notifications-tab.tsx
new file mode 100644
index 0000000..e2097a7
--- /dev/null
+++ b/src/pages/management/user/account/notifications-tab.tsx
@@ -0,0 +1,78 @@
+import { App, Button, Col, Row, Switch, Typography } from 'antd';
+
+import Card from '@/components/card';
+import { useThemeToken } from '@/theme/hooks';
+
+export default function NotificationsTab() {
+ const { notification } = App.useApp();
+ const { colorBgContainerDisabled, colorTextSecondary } = useThemeToken();
+ const handleClick = () => {
+ notification.success({
+ message: 'Update success!',
+ duration: 3,
+ });
+ };
+ return (
+
+
+
+ Activity
+
+ Donec mi odio, faucibus at, scelerisque quis
+
+
+
+
+
+
Email me when someone answers on my form
+
+
+
+
Email me when someone comments onmy article
+
+
+
+
Email me hen someone follows me
+
+
+
+
+
+
+ Applications
+
+ Donec mi odio, faucibus at, scelerisque quis
+
+
+
+
+
+
News and announcements
+
+
+
+
Weekly product updates
+
+
+
+
+
+
+
+
+ Save Changes
+
+
+
+
+ );
+}
diff --git a/src/pages/management/user/account/security-tab.tsx b/src/pages/management/user/account/security-tab.tsx
new file mode 100644
index 0000000..b346cf5
--- /dev/null
+++ b/src/pages/management/user/account/security-tab.tsx
@@ -0,0 +1,51 @@
+import { App, Button, Form, Input } from 'antd';
+
+import Card from '@/components/card';
+
+type FieldType = {
+ oldPassword?: string;
+ newPassword?: string;
+ confirmPassword?: string;
+};
+export default function SecurityTab() {
+ const { notification } = App.useApp();
+ const initFormValues = {
+ oldPassword: '',
+ newPassword: '',
+ confirmPassword: '',
+ };
+ const handleClick = () => {
+ notification.success({
+ message: 'Update success!',
+ duration: 3,
+ });
+ };
+
+ return (
+
+ label="Old Password" name="oldPassword">
+
+
+
+ label="New Password" name="newPassword">
+
+
+
+ label="Confirm New Password" name="confirmPassword">
+
+
+
+
+
+ Save Changes
+
+
+
+ );
+}
diff --git a/src/pages/management/user/profile/connections-tab.tsx b/src/pages/management/user/profile/connections-tab.tsx
new file mode 100644
index 0000000..2126560
--- /dev/null
+++ b/src/pages/management/user/profile/connections-tab.tsx
@@ -0,0 +1,115 @@
+import { faker } from '@faker-js/faker';
+import { Button, Col, Row } from 'antd';
+
+import Card from '@/components/card';
+import { Iconify } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+
+export default function ConnectionsTab() {
+ const items = [
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'UI Designer',
+ tags: ['Figma', 'Sketch'],
+ projects: '18',
+ tasks: '834',
+ connections: '129',
+ connected: true,
+ },
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'Developer',
+ tags: ['Angular', 'React'],
+ projects: '118',
+ tasks: '2.32k',
+ connections: '1.29k',
+ connected: false,
+ },
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'Developer',
+ tags: ['Html', 'React'],
+ projects: '32',
+ tasks: '1.25k',
+ connections: '890',
+ connected: false,
+ },
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'UI/UX Designer',
+ tags: ['Figma', 'Sketch', 'Photoshop'],
+ projects: '86',
+ tasks: '12.4k',
+ connections: '890',
+ connected: false,
+ },
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'Full Stack Developer',
+ tags: ['React', 'Html', 'Node.js'],
+ projects: '244',
+ tasks: '23.9k',
+ connections: '2.14k',
+ connected: true,
+ },
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ title: 'SEO',
+ tags: ['Analysis', 'Writing'],
+ projects: '32',
+ tasks: '1.28k',
+ connections: '1.27k',
+ connected: false,
+ },
+ ];
+ return (
+
+ {items.map((item) => (
+
+
+
+
+ {item.name}
+ {item.title}
+
+
+ {item.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+ {item.projects}
+ Projects
+
+
+ {item.tasks}
+ Tasks
+
+
+ {item.connections}
+ Tasks
+
+
+
+
+
+
+ CONNECTED
+
+
+
+
+ ))}
+
+ );
+}
diff --git a/src/pages/management/user/profile/index.tsx b/src/pages/management/user/profile/index.tsx
new file mode 100644
index 0000000..5059df8
--- /dev/null
+++ b/src/pages/management/user/profile/index.tsx
@@ -0,0 +1,88 @@
+import { CSSProperties, useState } from 'react';
+
+import CoverImage from '@/assets/images/cover/cover_4.jpg';
+import Card from '@/components/card';
+import { Iconify } from '@/components/icon';
+import { useUserInfo } from '@/store/userStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import ConnectionsTab from './connections-tab';
+import ProfileTab from './profile-tab';
+import ProjectsTab from './projects-tab';
+import TeamsTab from './teams-tab';
+
+function UserProfile() {
+ const { avatar, username } = useUserInfo();
+ const { colorTextBase } = useThemeToken();
+ const [currentTabIndex, setcurrentTabIndex] = useState(0);
+
+ const bgStyle: CSSProperties = {
+ background: `linear-gradient(rgba(0, 75, 80, 0.8), rgba(0, 75, 80, 0.8)) center center / cover no-repeat, url(${CoverImage})`,
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: 'center center',
+ };
+
+ const tabs = [
+ {
+ icon: ,
+ title: 'Profile',
+ content: ,
+ },
+ {
+ icon: ,
+ title: 'Teams',
+ content: ,
+ },
+ {
+ icon: ,
+ title: 'Projects',
+ content: ,
+ },
+ {
+ icon: ,
+ title: 'Connections',
+ content: ,
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+
+ {username}
+ TS FullStack
+
+
+
+
+
+ {tabs.map((tab, index) => (
+ setcurrentTabIndex(index)}
+ key={tab.title}
+ type="button"
+ style={{
+ marginRight: index >= tabs.length - 1 ? '0px' : '40px',
+ opacity: index === currentTabIndex ? 1 : 0.5,
+ borderBottom: index === currentTabIndex ? `2px solid ${colorTextBase}` : '',
+ }}
+ >
+ {tab.icon}
+ {tab.title}
+
+ ))}
+
+
+
+ {tabs[currentTabIndex].content}
+ >
+ );
+}
+
+export default UserProfile;
diff --git a/src/pages/management/user/profile/profile-tab.tsx b/src/pages/management/user/profile/profile-tab.tsx
new file mode 100644
index 0000000..a682f0a
--- /dev/null
+++ b/src/pages/management/user/profile/profile-tab.tsx
@@ -0,0 +1,363 @@
+import { faker } from '@faker-js/faker';
+import { Row, Col, Typography, Timeline, Table, Space, Avatar, Progress } from 'antd';
+import { ColumnsType } from 'antd/es/table';
+
+import { fakeAvatars } from '@/_mock/utils';
+import Card from '@/components/card';
+import { IconButton, Iconify, SvgIcon } from '@/components/icon';
+import Scrollbar from '@/components/scrollbar';
+import { useUserInfo } from '@/store/userStore';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+interface DataType {
+ key: string;
+ avatar: string;
+ name: string;
+ date: string;
+ leader: string;
+ team: string[];
+ status: number;
+}
+
+export default function ProfileTab() {
+ const { username } = useUserInfo();
+ const theme = useThemeToken();
+ const AboutItems = [
+ { icon: , label: 'Full Name', val: username },
+ { icon: , label: 'Role', val: 'Developer' },
+ { icon: , label: 'Country', val: 'USA' },
+ { icon: , label: 'Language', val: 'English' },
+ { icon: , label: 'Contact', val: '(123)456-7890' },
+ { icon: , label: 'Email', val: username },
+ ];
+
+ const ConnectionsItems = [
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ connections: `${faker.number.int(100)} Connections`,
+ connected: faker.datatype.boolean(),
+ },
+
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ connections: `${faker.number.int(100)} Connections`,
+ connected: faker.datatype.boolean(),
+ },
+
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ connections: `${faker.number.int(100)} Connections`,
+ connected: faker.datatype.boolean(),
+ },
+
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ connections: `${faker.number.int(100)} Connections`,
+ connected: faker.datatype.boolean(),
+ },
+
+ {
+ avatar: faker.image.avatarLegacy(),
+ name: faker.person.fullName(),
+ connections: `${faker.number.int(100)} Connections`,
+ connected: faker.datatype.boolean(),
+ },
+ ];
+
+ const TeamItems = [
+ {
+ avatar: ,
+ name: 'React Developers',
+ members: `${faker.number.int(100)} Members`,
+ tag: Developer ,
+ },
+ {
+ avatar: ,
+ name: 'UI Designer',
+ members: `${faker.number.int(100)} Members`,
+ tag: Designer ,
+ },
+ {
+ avatar: ,
+ name: 'Test Team',
+ members: `${faker.number.int(100)} Members`,
+ tag: Test ,
+ },
+ {
+ avatar: ,
+ name: 'Nest.js Developers',
+ members: `${faker.number.int(100)} Members`,
+ tag: Developer ,
+ },
+
+ {
+ avatar: ,
+ name: 'Digital Marketing',
+ members: `${faker.number.int(100)} Members`,
+ tag: Marketing ,
+ },
+ ];
+
+ const fakeProjectItems = () => {
+ const arr: DataType[] = [];
+ for (let i = 0; i <= 25; i += 1) {
+ arr.push({
+ key: faker.string.uuid(),
+ avatar: faker.image.urlPicsumPhotos(),
+ name: faker.company.buzzPhrase(),
+ date: faker.date.past().toDateString(),
+ leader: faker.person.fullName(),
+ team: fakeAvatars(faker.number.int({ min: 2, max: 5 })),
+ status: faker.number.int({ min: 50, max: 99 }),
+ });
+ }
+ return arr;
+ };
+
+ const ProjectColumns: ColumnsType = [
+ {
+ title: 'NAME',
+ dataIndex: 'name',
+ render: (_, record) => (
+
+
+
+ {record.name}
+ {record.date}
+
+
+ ),
+ },
+ {
+ title: 'LEADER',
+ dataIndex: 'leader',
+ render: (val) => {val} ,
+ },
+ {
+ title: 'TEAM',
+ dataIndex: 'team',
+ render: (val: string[]) => (
+
+ {val.map((item, index) => (
+
+ ))}
+
+ ),
+ },
+ {
+ title: 'STATUS',
+ dataIndex: 'status',
+ render: (val) => (
+
+ ),
+ },
+ {
+ title: 'ACTIONS',
+ dataIndex: 'action',
+ render: () => (
+
+
+
+
+
+ ),
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+
About
+
{faker.lorem.paragraph()}
+
+
+ {AboutItems.map((item, index) => (
+
+
{item.icon}
+
{item.label}:
+
{item.val}
+
+ ))}
+
+
+
+
+
+
+
+ Activity Timeline
+
+
+
8 Invoices have been paid
+
Wednesday
+
+
+ Invoices have been paid to the company.
+
+
+
+
+ invoice.pdf
+
+
+ ),
+ },
+ {
+ color: theme.colorPrimaryActive,
+ children: (
+
+
+
Create a new project for client 😎
+
April, 18
+
+
+ Invoices have been paid to the company.
+
+
+
+
+ {faker.person.fullName()} (client)
+
+
+
+ ),
+ },
+ {
+ color: theme.colorInfo,
+ children: (
+
+
+
Order #37745 from September
+
January, 10
+
+
+ Invoices have been paid to the company.
+
+
+ ),
+ },
+ {
+ color: theme.colorWarning,
+ children: (
+
+
+
Public Meeting
+
September, 30
+
+
+ ),
+ },
+ ]}
+ />
+
+
+
+
+
+
+
+ Connections
+
+
+
+
+
+ {ConnectionsItems.map((item, index) => (
+
+
+
+ {item.name}
+ {item.connections}
+
+
+
+
+
+ ))}
+
+
+
+ View all connections
+
+
+
+
+
+
+ Teams
+
+
+
+
+
+ {TeamItems.map((item, index) => (
+
+ {item.avatar}
+
+ {item.name}
+ {item.members}
+
+ {item.tag}
+
+ ))}
+
+
+
+ View all members
+
+
+
+
+
+
+
+ Projects
+
+
+
+
+ >
+ );
+}
diff --git a/src/pages/management/user/profile/projects-tab.tsx b/src/pages/management/user/profile/projects-tab.tsx
new file mode 100644
index 0000000..a87ec76
--- /dev/null
+++ b/src/pages/management/user/profile/projects-tab.tsx
@@ -0,0 +1,141 @@
+import { faker } from '@faker-js/faker';
+import { Row, Col, Avatar, Divider } from 'antd';
+import dayjs from 'dayjs';
+
+import { fakeAvatars } from '@/_mock/utils';
+import Card from '@/components/card';
+import { IconButton, Iconify } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+
+export default function ProjectsTab() {
+ const items = [
+ {
+ icon: ,
+ name: 'Admin Template',
+ client: faker.person.fullName(),
+ desc: 'Time is our most valuable asset, that is why we want to help you save it by creating…',
+ members: fakeAvatars(15),
+ startDate: dayjs(faker.date.past({ years: 1 })),
+ deadline: dayjs(faker.date.future({ years: 1 })),
+ messages: 236,
+ allHours: '98/135',
+ allTasks: faker.number.int({ min: 60, max: 99 }),
+ closedTasks: faker.number.int({ min: 30, max: 60 }),
+ },
+ {
+ icon: ,
+ name: 'App Design',
+ desc: 'App design combines the user interface (UI) and user experience (UX). ',
+ client: faker.person.fullName(),
+ members: fakeAvatars(27),
+ startDate: dayjs(faker.date.past({ years: 1 })),
+ deadline: dayjs(faker.date.future({ years: 1 })),
+ messages: 236,
+ allHours: '880/421',
+ allTasks: faker.number.int({ min: 60, max: 99 }),
+ closedTasks: faker.number.int({ min: 30, max: 60 }),
+ },
+ {
+ icon: ,
+ name: 'Figma Dashboard',
+ desc: 'Use this template to organize your design project. Some of the key features are… ',
+ client: faker.person.fullName(),
+ members: fakeAvatars(32),
+ startDate: dayjs(faker.date.past({ years: 1 })),
+ deadline: dayjs(faker.date.future({ years: 1 })),
+ messages: 236,
+ allHours: '1.2k/820',
+ allTasks: faker.number.int({ min: 60, max: 99 }),
+ closedTasks: faker.number.int({ min: 30, max: 60 }),
+ },
+ {
+ icon: ,
+ name: 'Create Website',
+ desc: 'Your domain name should reflect your products or services so that your... ',
+ client: faker.person.fullName(),
+ members: fakeAvatars(221),
+ startDate: dayjs(faker.date.past({ years: 1 })),
+ deadline: dayjs(faker.date.future({ years: 1 })),
+ messages: 236,
+ allHours: '142/420',
+ allTasks: faker.number.int({ min: 60, max: 99 }),
+ closedTasks: faker.number.int({ min: 30, max: 60 }),
+ },
+ {
+ icon: ,
+ name: 'Logo Design',
+ desc: 'Premium logo designs created by top logo designers. Create the branding of business. ',
+ client: faker.person.fullName(),
+ members: fakeAvatars(125),
+ startDate: dayjs(faker.date.past({ years: 1 })),
+ deadline: dayjs(faker.date.future({ years: 1 })),
+ messages: 232,
+ allHours: '580/445',
+ allTasks: faker.number.int({ min: 60, max: 99 }),
+ closedTasks: faker.number.int({ min: 30, max: 60 }),
+ },
+ ];
+ return (
+
+ {items.map((item) => (
+
+
+
+
+
+
+
+ Start Date:
+ {item.startDate.format('DD/MM/YYYY')}
+
+
+
+ Deadline:
+ {item.deadline.format('DD/MM/YYYY')}
+
+
+ {item.desc}
+
+
+
+
+
+
+
+ All Hours:
+ {item.allHours}
+
+
+
{item.deadline.diff(dayjs(), 'day')} days left
+
+
+
+ {item.members.map((memberAvatar, index) => (
+
+ ))}
+
+
+
+ {item.messages}
+
+
+
+
+
+ ))}
+
+ );
+}
diff --git a/src/pages/management/user/profile/teams-tab.tsx b/src/pages/management/user/profile/teams-tab.tsx
new file mode 100644
index 0000000..9add2c3
--- /dev/null
+++ b/src/pages/management/user/profile/teams-tab.tsx
@@ -0,0 +1,85 @@
+import { faker } from '@faker-js/faker';
+import { Row, Col, Avatar } from 'antd';
+
+import { fakeAvatars } from '@/_mock/utils';
+import Card from '@/components/card';
+import { IconButton, Iconify } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+
+export default function TeamsTab() {
+ const items = [
+ {
+ icon: ,
+ name: 'React Developers',
+ desc: 'We don’t make assumptions about the rest of your technology stack, so you can develop new features in React.',
+ members: fakeAvatars(25),
+ tags: ['React', 'AntD'],
+ },
+ {
+ icon: ,
+ name: 'Vue.js Dev Team',
+ desc: 'The development of Vue and its ecosystem is guided by an international team, some of whom have chosen to be featured below.',
+ members: fakeAvatars(20),
+ tags: ['Vue.js', 'Developer'],
+ },
+ {
+ icon: ,
+ name: 'Figma Resources',
+ desc: 'Explore, install, use, and remix thousands of plugins and files published to the Figma Community by designers and developers.',
+ members: fakeAvatars(45),
+ tags: ['UI/UX', 'Figma'],
+ },
+ {
+ icon: ,
+ name: 'Only Beginners',
+ desc: 'Learn the basics of how websites work, front-end vs back-end, and using a code editor. Learn basic HTML, CSS, and…',
+ members: fakeAvatars(50),
+ tags: ['CSS', 'HTML'],
+ },
+ {
+ icon: ,
+ name: 'Creative Designers',
+ desc: 'A design or product team is more than just the people on it. A team includes the people, the roles they play. ',
+ members: fakeAvatars(55),
+ tags: ['Sketch', 'XD'],
+ },
+ ];
+ return (
+
+ {items.map((item) => (
+
+
+
+ {item.icon}
+ {item.name}
+
+
+
+
+
+
+
+
+
+
+ {item.desc}
+
+
+
+ ))}
+
+ );
+}
diff --git a/src/pages/menu-level/menu-level-1a/index.tsx b/src/pages/menu-level/menu-level-1a/index.tsx
new file mode 100644
index 0000000..3a50902
--- /dev/null
+++ b/src/pages/menu-level/menu-level-1a/index.tsx
@@ -0,0 +1,5 @@
+import { Typography } from 'antd';
+
+export default function MenuLevel() {
+ return Menu Level: 1a ;
+}
diff --git a/src/pages/menu-level/menu-level-1b/menu-level-2a/index.tsx b/src/pages/menu-level/menu-level-1b/menu-level-2a/index.tsx
new file mode 100644
index 0000000..9196738
--- /dev/null
+++ b/src/pages/menu-level/menu-level-1b/menu-level-2a/index.tsx
@@ -0,0 +1,5 @@
+import { Typography } from 'antd';
+
+export default function MenuLevel() {
+ return Menu Level: 2a ;
+}
diff --git a/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3a/index.tsx b/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3a/index.tsx
new file mode 100644
index 0000000..295ea3a
--- /dev/null
+++ b/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3a/index.tsx
@@ -0,0 +1,5 @@
+import { Typography } from 'antd';
+
+export default function MenuLevel() {
+ return Menu Level: 3a ;
+}
diff --git a/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3b/index.tsx b/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3b/index.tsx
new file mode 100644
index 0000000..184dd02
--- /dev/null
+++ b/src/pages/menu-level/menu-level-1b/menu-level-2b/menu-level-3b/index.tsx
@@ -0,0 +1,5 @@
+import { Typography } from 'antd';
+
+export default function MenuLevel() {
+ return Menu Level: 3b ;
+}
diff --git a/src/pages/sys/error/Page403.tsx b/src/pages/sys/error/Page403.tsx
new file mode 100644
index 0000000..612d60f
--- /dev/null
+++ b/src/pages/sys/error/Page403.tsx
@@ -0,0 +1,128 @@
+import { Typography } from 'antd';
+import { m } from 'framer-motion';
+import { Helmet } from 'react-helmet-async';
+import { NavLink } from 'react-router-dom';
+
+import Character4 from '@/assets/images/characters/character_4.png';
+import MotionContainer from '@/components/animate/motion-container';
+import { varBounce } from '@/components/animate/variants/bounce';
+import { useThemeToken } from '@/theme/hooks';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+export default function Page403() {
+ const {
+ colorBgBase,
+ colorTextBase,
+ colorPrimary,
+ colorPrimaryActive,
+ colorPrimaryTextActive,
+ colorPrimaryHover,
+ } = useThemeToken();
+ return (
+ <>
+
+ 403 No Permission!
+
+
+
+
+
+
+ No permission
+
+
+
+
+
+ The page you are trying access has restricted access. Please refer to your system
+ administrator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* hand */}
+
+
+
+ {/* 0 */}
+
+ {/* 4_3 */}
+
+
+
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+ >
+ );
+}
diff --git a/src/pages/sys/error/Page404.tsx b/src/pages/sys/error/Page404.tsx
new file mode 100644
index 0000000..ccb4dbb
--- /dev/null
+++ b/src/pages/sys/error/Page404.tsx
@@ -0,0 +1,119 @@
+import { Typography } from 'antd';
+import { m } from 'framer-motion';
+import { Helmet } from 'react-helmet-async';
+import { NavLink } from 'react-router-dom';
+
+import Character6 from '@/assets/images/characters/character_6.png';
+import MotionContainer from '@/components/animate/motion-container';
+import { varBounce } from '@/components/animate/variants/bounce';
+import { useThemeToken } from '@/theme/hooks';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+export default function Page404() {
+ const {
+ colorBgBase,
+ colorTextBase,
+ colorPrimary,
+ colorPrimaryActive,
+ colorPrimaryTextActive,
+ colorPrimaryHover,
+ } = useThemeToken();
+ return (
+ <>
+
+ 404 Page Not Found!
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+
+
+
+
+
+
+ {/* background */}
+
+ {/* character */}
+
+ {/* sun */}
+
+ {/* sun */}
+
+ {/* 0 */}
+
+ {/* 4_4 */}
+
+ {/* cloud */}
+
+
+
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+ >
+ );
+}
diff --git a/src/pages/sys/error/Page500.tsx b/src/pages/sys/error/Page500.tsx
new file mode 100644
index 0000000..e9b7daf
--- /dev/null
+++ b/src/pages/sys/error/Page500.tsx
@@ -0,0 +1,160 @@
+import { Typography } from 'antd';
+import { m } from 'framer-motion';
+import { Helmet } from 'react-helmet-async';
+import { NavLink } from 'react-router-dom';
+
+import Character8 from '@/assets/images/characters/character_8.png';
+import MotionContainer from '@/components/animate/motion-container';
+import { varBounce } from '@/components/animate/variants/bounce';
+import { useThemeToken } from '@/theme/hooks';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+export default function Page() {
+ const { colorBgBase, colorTextBase, colorPrimary } = useThemeToken();
+ return (
+ <>
+
+ 500 Internal Server Error!
+
+
+
+
+
+
+ 500 Internal Server Error
+
+
+
+
+
+ There was an error, please try again later.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+ >
+ );
+}
diff --git a/src/pages/sys/error/PageError.tsx b/src/pages/sys/error/PageError.tsx
new file mode 100644
index 0000000..2ea35b5
--- /dev/null
+++ b/src/pages/sys/error/PageError.tsx
@@ -0,0 +1,230 @@
+import { Typography } from 'antd';
+import { m } from 'framer-motion';
+import { Helmet } from 'react-helmet-async';
+
+import Character5 from '@/assets/images/characters/character_5.png';
+import MotionContainer from '@/components/animate/motion-container';
+import { varBounce } from '@/components/animate/variants/bounce';
+import { useRouter } from '@/router/hooks';
+import { useThemeToken } from '@/theme/hooks';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import type { FallbackProps } from 'react-error-boundary';
+
+export default function PageError({ error, resetErrorBoundary }: FallbackProps) {
+ const { colorBgBase, colorTextBase, colorPrimary, colorPrimaryActive } = useThemeToken();
+
+ const { replace } = useRouter();
+
+ const goHome = () => {
+ resetErrorBoundary();
+ replace(APP_HOMEPAGE);
+ };
+ return (
+
+
+ Sorry, Page error occurred!
+
+
+
+
+
+
+ Sorry, Page error occurred!
+
+
+
+
+
+ {error.toString()}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Go to Home
+
+
+
+
+ );
+}
diff --git a/src/pages/sys/login/Login.tsx b/src/pages/sys/login/Login.tsx
new file mode 100644
index 0000000..c4b6a8a
--- /dev/null
+++ b/src/pages/sys/login/Login.tsx
@@ -0,0 +1,58 @@
+import { Layout, Typography } from 'antd';
+import Color from 'color';
+import { useTranslation } from 'react-i18next';
+import { Navigate } from 'react-router-dom';
+
+import DashboardImg from '@/assets/images/background/dashboard.png';
+import Overlay2 from '@/assets/images/background/overlay_2.jpg';
+import { useUserToken } from '@/store/userStore';
+import { useThemeToken } from '@/theme/hooks';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import LoginForm from './LoginForm';
+import { LoginStateProvider } from './providers/LoginStateProvider';
+
+function Login() {
+ const { t } = useTranslation();
+ const token = useUserToken();
+ const { colorBgElevated } = useThemeToken();
+
+ // Determine whether the user has permission
+ if (token.access_token) {
+ // If authorized, go to the home page
+ return ;
+ }
+
+ const gradientBg = Color(colorBgElevated).alpha(0.9).toString();
+ const bg = `linear-gradient(${gradientBg}, ${gradientBg}) center center / cover no-repeat,url(${Overlay2})`;
+
+ return (
+
+
+
+ aelfscan Admin
+
+
+
+ {t('sys.login.signInSecondTitle')}
+
+
+
+
+
+
+ {/* */}
+ {/* */}
+ {/* */}
+ {/* */}
+
+
+
+ );
+}
+export default Login;
diff --git a/src/pages/sys/login/LoginForm.tsx b/src/pages/sys/login/LoginForm.tsx
new file mode 100644
index 0000000..07d31e5
--- /dev/null
+++ b/src/pages/sys/login/LoginForm.tsx
@@ -0,0 +1,115 @@
+import { Button, Checkbox, Col, Form, Input, Row } from 'antd';
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { DEFAULT_USER } from '@/_mock/assets';
+import { SignInReq } from '@/api/services/userService';
+import { useSignIn } from '@/store/userStore';
+
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+function LoginForm() {
+ const { t } = useTranslation();
+ const [loading, setLoading] = useState(false);
+
+ const { loginState } = useLoginStateContext();
+ const signIn = useSignIn();
+
+ if (loginState !== LoginStateEnum.LOGIN) return null;
+
+ const handleFinish = async ({ username, password }: SignInReq) => {
+ setLoading(true);
+ try {
+ await signIn({
+ username,
+ password,
+ });
+ } finally {
+ setLoading(false);
+ }
+ };
+ return (
+ <>
+ {t('sys.login.signInFormTitle')}
+
+
+
+
+
+
+
+
+
+
+ {t('sys.login.rememberMe')}
+
+
+ {/*
+ setLoginState(LoginStateEnum.RESET_PASSWORD)}
+ size="small"
+ >
+ {t('sys.login.forgetPassword')}
+
+ */}
+
+
+
+
+ {t('sys.login.loginButton')}
+
+
+
+ {/*
+
+ setLoginState(LoginStateEnum.MOBILE)}
+ >
+ {t('sys.login.mobileSignInFormTitle')}
+
+
+
+ setLoginState(LoginStateEnum.QR_CODE)}
+ >
+ {t('sys.login.qrSignInFormTitle')}
+
+
+ setLoginState(LoginStateEnum.REGISTER)}>
+ {t('sys.login.signUpFormTitle')}
+
+
*/}
+
+ {/* {t('sys.login.otherSignIn')}
+
+ */}
+
+ >
+ );
+}
+
+export default LoginForm;
diff --git a/src/pages/sys/login/MobileForm.tsx b/src/pages/sys/login/MobileForm.tsx
new file mode 100644
index 0000000..66f44d2
--- /dev/null
+++ b/src/pages/sys/login/MobileForm.tsx
@@ -0,0 +1,88 @@
+import { Button, Col, Form, Input, Row, Statistic } from 'antd';
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { ReturnButton } from './components/ReturnButton';
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+const { Countdown } = Statistic;
+
+function MobileForm() {
+ const { t } = useTranslation();
+ const onFinish = (values: any) => {
+ console.log('Received values of form: ', values);
+ };
+
+ const [countdown, setCountdown] = useState(0);
+ const [second, setSecond] = useState(0);
+ const { loginState, backToLogin } = useLoginStateContext();
+
+ if (loginState !== LoginStateEnum.MOBILE) return null;
+
+ const start = () => {
+ setCountdown(60);
+ setSecond(60);
+ };
+
+ const reset = () => {
+ setCountdown(0);
+ setSecond(60);
+ };
+ return (
+ <>
+
+ {t('sys.login.mobileSignInFormTitle')}
+
+
+
+
+
+
+
+
+
+
+
+ {countdown === 0 ? (
+ {t('sys.login.sendSmsButton')}
+ ) : (
+
+ {
+ setCountdown(Number(time) / 1000);
+ setSecond(Math.floor(Number(time) / 1000));
+ }}
+ format="ss"
+ onFinish={reset}
+ />
+ {t('sys.login.sendSmsText', { second })}
+
+ )}
+
+
+
+
+
+
+ {t('sys.login.loginButton')}
+
+
+
+ {
+ reset();
+ backToLogin();
+ }}
+ />
+
+ >
+ );
+}
+
+export default MobileForm;
diff --git a/src/pages/sys/login/QrCodeForm.tsx b/src/pages/sys/login/QrCodeForm.tsx
new file mode 100644
index 0000000..c1e260f
--- /dev/null
+++ b/src/pages/sys/login/QrCodeForm.tsx
@@ -0,0 +1,24 @@
+import { QRCode } from 'antd';
+import { useTranslation } from 'react-i18next';
+
+import { ReturnButton } from './components/ReturnButton';
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+function QrCodeFrom() {
+ const { t } = useTranslation();
+ const { loginState, backToLogin } = useLoginStateContext();
+
+ if (loginState !== LoginStateEnum.QR_CODE) return null;
+ return (
+ <>
+ {t('sys.login.qrSignInFormTitle')}
+
+
+
{t('sys.login.scanSign')}
+
+
+ >
+ );
+}
+
+export default QrCodeFrom;
diff --git a/src/pages/sys/login/RegisterForm.tsx b/src/pages/sys/login/RegisterForm.tsx
new file mode 100644
index 0000000..426c329
--- /dev/null
+++ b/src/pages/sys/login/RegisterForm.tsx
@@ -0,0 +1,86 @@
+import { useMutation } from '@tanstack/react-query';
+import { Button, Form, Input } from 'antd';
+import { useTranslation } from 'react-i18next';
+
+import userService from '@/api/services/userService';
+
+import { ReturnButton } from './components/ReturnButton';
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+function RegisterForm() {
+ const { t } = useTranslation();
+ const signUpMutation = useMutation({
+ mutationFn: userService.signup,
+ });
+
+ const { loginState, backToLogin } = useLoginStateContext();
+ if (loginState !== LoginStateEnum.REGISTER) return null;
+
+ const onFinish = async (values: any) => {
+ console.log('Received values of form: ', values);
+ await signUpMutation.mutateAsync(values);
+ backToLogin();
+ };
+
+ return (
+ <>
+ {t('sys.login.signUpFormTitle')}
+
+
+
+
+
+
+
+
+
+ ({
+ validator(_, value) {
+ if (!value || getFieldValue('password') === value) {
+ return Promise.resolve();
+ }
+ return Promise.reject(new Error(t('sys.login.diffPwd')));
+ },
+ }),
+ ]}
+ >
+
+
+
+
+ {t('sys.login.registerButton')}
+
+
+
+
+
+
+
+ >
+ );
+}
+
+export default RegisterForm;
diff --git a/src/pages/sys/login/ResetForm.tsx b/src/pages/sys/login/ResetForm.tsx
new file mode 100644
index 0000000..a0adb9f
--- /dev/null
+++ b/src/pages/sys/login/ResetForm.tsx
@@ -0,0 +1,47 @@
+import { Button, Form, Input } from 'antd';
+import { useTranslation } from 'react-i18next';
+
+import { SvgIcon } from '@/components/icon';
+
+import { ReturnButton } from './components/ReturnButton';
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+function ResetForm() {
+ const onFinish = (values: any) => {
+ console.log('Received values of form: ', values);
+ };
+
+ const { t } = useTranslation();
+ const { loginState, backToLogin } = useLoginStateContext();
+
+ if (loginState !== LoginStateEnum.RESET_PASSWORD) return null;
+
+ return (
+ <>
+
+
+
+
+ {t('sys.login.forgetFormTitle')}
+
+
+
+
+
+
+ {t('sys.login.sendEmailButton')}
+
+
+
+
+
+ >
+ );
+}
+
+export default ResetForm;
diff --git a/src/pages/sys/login/components/ReturnButton.tsx b/src/pages/sys/login/components/ReturnButton.tsx
new file mode 100644
index 0000000..0c5a09b
--- /dev/null
+++ b/src/pages/sys/login/components/ReturnButton.tsx
@@ -0,0 +1,18 @@
+import { Button } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { MdArrowBackIosNew } from 'react-icons/md';
+
+interface ReturnButtonProps {
+ onClick?: () => void;
+}
+export function ReturnButton({ onClick }: ReturnButtonProps) {
+ const { t } = useTranslation();
+ return (
+
+
+
+ {t('sys.login.backSignIn')}
+
+
+ );
+}
diff --git a/src/pages/sys/login/providers/LoginStateProvider.tsx b/src/pages/sys/login/providers/LoginStateProvider.tsx
new file mode 100644
index 0000000..a8f14e8
--- /dev/null
+++ b/src/pages/sys/login/providers/LoginStateProvider.tsx
@@ -0,0 +1,39 @@
+import { PropsWithChildren, createContext, useContext, useMemo, useState } from 'react';
+
+export enum LoginStateEnum {
+ LOGIN,
+ REGISTER,
+ RESET_PASSWORD,
+ MOBILE,
+ QR_CODE,
+}
+
+interface LoginStateContextType {
+ loginState: LoginStateEnum;
+ setLoginState: (loginState: LoginStateEnum) => void;
+ backToLogin: () => void;
+}
+const LoginStateContext = createContext({
+ loginState: LoginStateEnum.LOGIN,
+ setLoginState: () => {},
+ backToLogin: () => {},
+});
+
+export function useLoginStateContext() {
+ const context = useContext(LoginStateContext);
+ return context;
+}
+
+export function LoginStateProvider({ children }: PropsWithChildren) {
+ const [loginState, setLoginState] = useState(LoginStateEnum.LOGIN);
+
+ function backToLogin() {
+ setLoginState(LoginStateEnum.LOGIN);
+ }
+
+ const value: LoginStateContextType = useMemo(
+ () => ({ loginState, setLoginState, backToLogin }),
+ [loginState],
+ );
+ return {children} ;
+}
diff --git a/src/pages/sys/others/blank.tsx b/src/pages/sys/others/blank.tsx
new file mode 100644
index 0000000..ac240b2
--- /dev/null
+++ b/src/pages/sys/others/blank.tsx
@@ -0,0 +1,5 @@
+import Card from '@/components/card';
+
+export default function BlankPage() {
+ return ;
+}
diff --git a/src/pages/sys/others/calendar/calendar-event-form.tsx b/src/pages/sys/others/calendar/calendar-event-form.tsx
new file mode 100644
index 0000000..b020d59
--- /dev/null
+++ b/src/pages/sys/others/calendar/calendar-event-form.tsx
@@ -0,0 +1,169 @@
+import { faker } from '@faker-js/faker';
+import { EventInput } from '@fullcalendar/core';
+import { ColorPicker, DatePicker, Form, Input, Modal, Switch } from 'antd';
+import { Dayjs } from 'dayjs';
+import { useEffect } from 'react';
+
+import { IconButton, Iconify } from '@/components/icon';
+
+import type { ModalProps } from 'antd/es/modal/interface';
+
+export type CalendarEventFormFieldType = Pick & {
+ id: string;
+ description?: string;
+ start?: Dayjs;
+ end?: Dayjs;
+};
+
+type Props = {
+ type: 'edit' | 'add';
+ open: boolean;
+ onCancel: VoidFunction;
+ onEdit: (event: CalendarEventFormFieldType) => void;
+ onCreate: (event: CalendarEventFormFieldType) => void;
+ onDelete: (id: string) => void;
+ initValues: CalendarEventFormFieldType;
+};
+
+const COLORS = [
+ '#00a76f',
+ '#8e33ff',
+ '#00b8d9',
+ '#003768',
+ '#22c55e',
+ '#ffab00',
+ '#ff5630',
+ '#7a0916',
+];
+
+export default function CalendarEventForm({
+ type,
+ open,
+ onCancel,
+ initValues = { id: faker.string.uuid() },
+ onEdit,
+ onCreate,
+ onDelete,
+}: Props) {
+ const title = type === 'add' ? 'Add Event' : 'Edit Event';
+ const [form] = Form.useForm();
+
+ useEffect(() => {
+ const { color = COLORS[0], ...others } = initValues;
+ form.setFieldsValue({ ...others, color });
+ }, [initValues, form]);
+
+ // eslint-disable-next-line react/no-unstable-nested-components, react/function-component-definition
+ const ModalFooter: ModalProps['footer'] = (_, { OkBtn, CancelBtn }) => {
+ return (
+
+ {type === 'edit' ? (
+
+
{
+ onDelete(initValues.id);
+ onCancel();
+ }}
+ >
+
+
+
+
+
+
+
+ ) : (
+ <>
+
+
+ >
+ )}
+
+ );
+ };
+
+ return (
+ {
+ form
+ .validateFields()
+ .then((values) => {
+ form.resetFields();
+
+ const { id } = initValues;
+ const event = { ...values, id };
+ if (type === 'add') onCreate(event);
+ if (type === 'edit') onEdit(event);
+ onCancel();
+ })
+ .catch((info) => {
+ console.log('Validate Failed:', info);
+ });
+ }}
+ >
+
+ label="Titile"
+ name="title"
+ rules={[{ required: true, message: 'Please input title!' }]}
+ >
+
+
+
+ label="Desc" name="description">
+
+
+
+
+ label="All day"
+ name="allDay"
+ valuePropName="checked"
+ >
+
+
+
+
+ label="Start date"
+ name="start"
+ rules={[{ required: true, message: 'Please input start date!' }]}
+ >
+
+
+
+
+ label="End date"
+ name="end"
+ rules={[{ required: true, message: 'Please input end date!' }]}
+ >
+
+
+
+
+ label="Color"
+ name="color"
+ getValueFromEvent={(e) => e.toHexString()}
+ >
+
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/calendar/calendar-event.tsx b/src/pages/sys/others/calendar/calendar-event.tsx
new file mode 100644
index 0000000..083833f
--- /dev/null
+++ b/src/pages/sys/others/calendar/calendar-event.tsx
@@ -0,0 +1,21 @@
+import type { EventContentArg } from '@fullcalendar/core';
+
+export default function CalendarEvent(eventInfo: EventContentArg) {
+ const { timeText, event, backgroundColor } = eventInfo;
+
+ return (
+
+ );
+}
diff --git a/src/pages/sys/others/calendar/calendar-header.tsx b/src/pages/sys/others/calendar/calendar-header.tsx
new file mode 100644
index 0000000..1a874c8
--- /dev/null
+++ b/src/pages/sys/others/calendar/calendar-header.tsx
@@ -0,0 +1,106 @@
+import { Button, Dropdown, MenuProps } from 'antd';
+import dayjs from 'dayjs';
+import { ReactNode, useMemo } from 'react';
+
+import { IconButton, Iconify } from '@/components/icon';
+import { useResponsive } from '@/theme/hooks';
+
+export type HandleMoveArg = 'next' | 'prev' | 'today';
+export type ViewType = 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay' | 'listWeek';
+type ViewTypeMenu = {
+ key: string;
+ label: string;
+ view: ViewType;
+ icon: ReactNode;
+};
+
+type Props = {
+ now: Date;
+ view: ViewType;
+ onMove: (action: HandleMoveArg) => void;
+ onCreate: VoidFunction;
+ onViewTypeChange: (view: ViewType) => void;
+};
+export default function CalendarHeader({ now, view, onMove, onCreate, onViewTypeChange }: Props) {
+ const { screenMap } = useResponsive();
+
+ const items = useMemo(
+ () => [
+ {
+ key: '1',
+ label: 'Month',
+ view: 'dayGridMonth',
+ icon: ,
+ },
+ {
+ key: '2',
+ label: 'Week',
+ view: 'timeGridWeek',
+ icon: ,
+ },
+ {
+ key: '3',
+ label: 'Day',
+ view: 'timeGridDay',
+ icon: ,
+ },
+ {
+ key: '4',
+ label: 'List',
+ view: 'listWeek',
+ icon: ,
+ },
+ ],
+ [],
+ );
+
+ const handleMenuClick: MenuProps['onClick'] = (e) => {
+ const selectedViewType = items.find((item) => item.key === e.key)!;
+ onViewTypeChange(selectedViewType.view);
+ };
+
+ const viewTypeMenu = (view: ViewType) => {
+ const { icon, label } = items.find((item) => item.view === view)!;
+ return (
+
+ {icon}
+ {label}
+
+
+ );
+ };
+
+ return (
+
+ {screenMap.lg && (
+
+
+ {viewTypeMenu(view)}
+
+
+ )}
+
+
+
+ onMove('prev')} size={20} />
+
+ {dayjs(now).format('DD MMM YYYY')}
+
+ onMove('next')} size={20} />
+
+
+
+
+
onMove('today')}>
+ Today
+
+
onCreate()}>
+
+
+ New Event
+
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/calendar/event-utils.ts b/src/pages/sys/others/calendar/event-utils.ts
new file mode 100644
index 0000000..a361213
--- /dev/null
+++ b/src/pages/sys/others/calendar/event-utils.ts
@@ -0,0 +1,60 @@
+import { faker } from '@faker-js/faker';
+import { EventInput } from '@fullcalendar/core';
+import dayjs from 'dayjs';
+
+export const INITIAL_EVENTS: EventInput[] = [
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().toISOString(),
+ end: dayjs().add(10, 'hour').toISOString(),
+ color: '#7a0916',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(1, 'day').toISOString(),
+ end: dayjs().add(3, 'day').toISOString(),
+ allDay: faker.datatype.boolean(),
+ color: '#00b8d9',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(3, 'day').toISOString(),
+ end: dayjs().add(5, 'day').toISOString(),
+ allDay: faker.datatype.boolean(),
+ color: '#ff5630',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(7, 'day').toISOString(),
+ end: dayjs().add(8, 'day').toISOString(),
+ allDay: faker.datatype.boolean(),
+ color: '#ffab00',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(7, 'day').toISOString(),
+ end: dayjs().add(8, 'day').toISOString(),
+ allDay: faker.datatype.boolean(),
+ color: '#ffab00',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(8, 'day').toISOString(),
+ end: dayjs().add(9, 'day').toISOString(),
+ allDay: faker.datatype.boolean(),
+ color: '#8e33ff',
+ },
+ {
+ id: faker.string.uuid(),
+ title: faker.lorem.words({ min: 2, max: 5 }),
+ start: dayjs().add(10, 'day').toISOString(),
+ end: dayjs().add(11, 'day').toISOString(),
+ color: '#00a76f',
+ },
+];
diff --git a/src/pages/sys/others/calendar/index.tsx b/src/pages/sys/others/calendar/index.tsx
new file mode 100644
index 0000000..1d4aae7
--- /dev/null
+++ b/src/pages/sys/others/calendar/index.tsx
@@ -0,0 +1,212 @@
+import { faker } from '@faker-js/faker';
+import { DateSelectArg, EventClickArg, EventInput } from '@fullcalendar/core';
+// fullcalendar plugins
+import dayGridPlugin from '@fullcalendar/daygrid';
+import interactionPlugin from '@fullcalendar/interaction';
+import listPlugin from '@fullcalendar/list';
+import FullCalendar from '@fullcalendar/react';
+import timeGridPlugin from '@fullcalendar/timegrid';
+import dayjs from 'dayjs';
+import { useEffect, useLayoutEffect, useRef, useState } from 'react';
+
+import Card from '@/components/card';
+import { useSettings } from '@/store/settingStore';
+import { useResponsive } from '@/theme/hooks';
+
+import CalendarEvent from './calendar-event';
+import CalendarEventForm, { CalendarEventFormFieldType } from './calendar-event-form';
+import CalendarHeader, { HandleMoveArg, ViewType } from './calendar-header';
+import { INITIAL_EVENTS } from './event-utils';
+import { StyledCalendar } from './styles';
+
+const DefaultEventInitValue = {
+ id: faker.string.uuid(),
+ title: '',
+ description: '',
+ allDay: false,
+ start: dayjs(),
+ end: dayjs(),
+ color: '',
+};
+export default function Calendar() {
+ const fullCalendarRef = useRef(null);
+ const [view, setView] = useState('dayGridMonth');
+ const [date, setDate] = useState(new Date());
+ const [open, setOpen] = useState(false);
+ const [eventInitValue, setEventInitValue] =
+ useState(DefaultEventInitValue);
+ const [eventFormType, setEventFormType] = useState<'add' | 'edit'>('add');
+
+ const { themeMode } = useSettings();
+ const { screenMap } = useResponsive();
+
+ useEffect(() => {
+ if (screenMap.xs) {
+ setView('listWeek');
+ }
+ }, [screenMap]);
+ /**
+ * calendar header events
+ */
+ const handleMove = (action: HandleMoveArg) => {
+ const calendarApi = fullCalendarRef.current!.getApi();
+ switch (action) {
+ case 'prev':
+ calendarApi.prev();
+ break;
+ case 'next':
+ calendarApi.next();
+ break;
+ case 'today':
+ calendarApi.today();
+ break;
+ default:
+ break;
+ }
+ setDate(calendarApi.getDate());
+ };
+ const handleViewTypeChange = (view: ViewType) => {
+ setView(view);
+ };
+
+ useLayoutEffect(() => {
+ const calendarApi = fullCalendarRef.current!.getApi();
+ setTimeout(() => {
+ calendarApi.changeView(view);
+ });
+ }, [view]);
+
+ /**
+ * calendar grid events
+ */
+ // select date range
+ const handleDateSelect = (selectInfo: DateSelectArg) => {
+ const calendarApi = selectInfo.view.calendar;
+ calendarApi.unselect(); // clear date selection
+ setOpen(true);
+ setEventFormType('add');
+ setEventInitValue({
+ id: faker.string.uuid(),
+ title: '',
+ description: '',
+ start: dayjs(selectInfo.startStr),
+ end: dayjs(selectInfo.endStr),
+ allDay: selectInfo.allDay,
+ });
+ };
+
+ /**
+ * calendar event events
+ */
+ // click event and open modal
+ const handleEventClick = (arg: EventClickArg) => {
+ const { title, extendedProps, allDay, start, end, backgroundColor, id } = arg.event;
+ setOpen(true);
+ setEventFormType('edit');
+ const newEventValue: CalendarEventFormFieldType = {
+ id,
+ title,
+ allDay,
+ color: backgroundColor,
+ description: extendedProps.description,
+ };
+ if (start) {
+ newEventValue.start = dayjs(start);
+ }
+
+ if (end) {
+ newEventValue.end = dayjs(end);
+ }
+ setEventInitValue(newEventValue);
+ };
+ const handleCancel = () => {
+ setEventInitValue(DefaultEventInitValue);
+ setOpen(false);
+ };
+ // edit event
+ const handleEdit = (values: CalendarEventFormFieldType) => {
+ const { id, title = '', description, start, end, allDay = false, color } = values;
+ const calendarApi = fullCalendarRef.current!.getApi();
+ const oldEvent = calendarApi.getEventById(id);
+
+ const newEvent: EventInput = {
+ id,
+ title,
+ allDay,
+ color,
+ extendedProps: {
+ description,
+ },
+ };
+ if (start) newEvent.start = start.toDate();
+ if (end) newEvent.end = end.toDate();
+
+ oldEvent?.remove();
+ calendarApi.addEvent(newEvent);
+ };
+ // create event
+ const handleCreate = (values: CalendarEventFormFieldType) => {
+ const calendarApi = fullCalendarRef.current!.getApi();
+ const { title = '', description, start, end, allDay = false, color } = values;
+
+ const newEvent: EventInput = {
+ id: faker.string.uuid(),
+ title,
+ allDay,
+ color,
+ extendedProps: {
+ description,
+ },
+ };
+ if (start) newEvent.start = start.toDate();
+ if (end) newEvent.end = end.toDate();
+
+ calendarApi.addEvent(newEvent);
+ };
+ // delete event
+ const handleDelete = (id: string) => {
+ const calendarApi = fullCalendarRef.current!.getApi();
+ const oldEvent = calendarApi.getEventById(id);
+ oldEvent?.remove();
+ };
+
+ return (
+
+
+
+ setOpen(true)}
+ onViewTypeChange={handleViewTypeChange}
+ />
+
+
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/calendar/styles.ts b/src/pages/sys/others/calendar/styles.ts
new file mode 100644
index 0000000..37b1562
--- /dev/null
+++ b/src/pages/sys/others/calendar/styles.ts
@@ -0,0 +1,144 @@
+import styled from 'styled-components';
+
+import { ThemeMode } from '#/enum';
+
+export const StyledCalendar = styled.div<{ $themeMode: ThemeMode }>`
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ -ms-overflow-style: none;
+ scrollbar-width: none;
+ overflow-y: scroll;
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ .fc {
+ width: 100%;
+ height: 100%;
+ /* override fullcalendar css variables */
+ --fc-border-color: rgba(145, 158, 171, 0.16);
+ --fc-now-indicator-color: #ff5630;
+ --fc-today-bg-color: rgba(145, 158, 171, 0.08);
+ --fc-page-bg-color: ${(props) =>
+ props.$themeMode === ThemeMode.Light ? '#ffffff' : '#161c24'};
+ --fc-neutral-bg-color: ${(props) =>
+ props.$themeMode === ThemeMode.Light ? '#F4F6F8' : 'rgba(145, 158, 171, 0.12)'};
+ --fc-list-event-hover-bg-color: rgba(145, 158, 171, 0.08);
+ --fc-highlight-color: rgba(145, 158, 171, 0.08);
+
+ a {
+ color: ${(props) => (props.$themeMode === ThemeMode.Dark ? '#ffffff' : '#212b36')};
+ }
+ .fc-col-header {
+ box-shadow: rgba(145, 158, 171, 0.2) 0px -1px 0px inset;
+ th {
+ border-color: transparent;
+ }
+ .fc-col-header-cell-cushion {
+ font-weight: 600;
+ font-size: 0.875rem;
+ font-family: 'Public Sans', sans-serif;
+ padding: 8px 0px;
+ }
+ }
+
+ /* view Month Week Day */
+ .fc-dayGridMonth-view,
+ .fc-timeGridWeek-view,
+ .fc-timeGridDay-view {
+ .fc-daygrid-day-number {
+ line-height: 1.57143;
+ font-size: 0.875rem;
+ font-family: 'Public Sans', sans-serif;
+ font-weight: 400;
+ padding: 8px 8px 0px;
+ }
+ .fc-daygrid-event {
+ margin-top: 4px;
+ .fc-event-start,
+ .fc-event-end {
+ margin-left: 4px;
+ margin-right: 4px;
+ }
+ }
+ .fc-event {
+ border-color: transparent !important;
+ background-color: transparent !important;
+
+ .fc-event-main-wrapper {
+ border-radius: 6px;
+ width: 100%;
+ background-color: #fff;
+ &::before {
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ content: '';
+ opacity: 0.24;
+ height: 100%;
+ border-radius: 6px;
+ position: absolute;
+ background-color: currentcolor;
+ transition: opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
+ }
+ .fc-event-main-frame {
+ font-size: 13px;
+ line-height: 20px;
+ filter: brightness(0.48);
+ display: flex;
+ width: 100%;
+ .fc-event-time {
+ overflow: unset;
+ font-weight: 700;
+ }
+ .fc-event-title-container {
+ flex-grow: 1;
+ flex-shrink: 1;
+ min-width: 0px;
+ .fc-event-title {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* view list */
+ .fc-list {
+ .fc-list-day {
+ th {
+ z-index: 100;
+ }
+ }
+ .fc-list-day-text,
+ .fc-list-day-side-text {
+ line-height: 1.57143;
+ font-size: 0.875rem;
+ font-family: 'Public Sans', sans-serif;
+ font-weight: 400;
+ }
+
+ .fc-list-event-time {
+ color: ${(props) =>
+ props.$themeMode === ThemeMode.Light ? 'rgb(99, 115, 129)' : 'rgb(145, 158, 171)'};
+ }
+ .fc-event-title {
+ color: ${(props) =>
+ props.$themeMode === ThemeMode.Dark ? 'rgb(255, 255, 255)' : 'rgb(33, 43, 54)'};
+ }
+ .fc-list-table {
+ th,
+ td {
+ border-color: transparent;
+ }
+ }
+
+ .fc-event-main-frame {
+ background-color: transparent;
+ }
+ }
+ }
+`;
diff --git a/src/pages/sys/others/iframe/external-link.tsx b/src/pages/sys/others/iframe/external-link.tsx
new file mode 100644
index 0000000..8f9de87
--- /dev/null
+++ b/src/pages/sys/others/iframe/external-link.tsx
@@ -0,0 +1,15 @@
+import { useLayoutEffect } from 'react';
+
+import { useRouter } from '@/router/hooks';
+
+type Props = {
+ src: string;
+};
+export default function ExternalLink({ src }: Props) {
+ const { back } = useRouter();
+ useLayoutEffect(() => {
+ window.open(src, '_black');
+ back();
+ });
+ return
;
+}
diff --git a/src/pages/sys/others/iframe/index.tsx b/src/pages/sys/others/iframe/index.tsx
new file mode 100644
index 0000000..3d46427
--- /dev/null
+++ b/src/pages/sys/others/iframe/index.tsx
@@ -0,0 +1,10 @@
+type Props = {
+ src: string;
+};
+export default function Iframe({ src = '' }: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/kanban/demo.tsx b/src/pages/sys/others/kanban/demo.tsx
new file mode 100644
index 0000000..819029a
--- /dev/null
+++ b/src/pages/sys/others/kanban/demo.tsx
@@ -0,0 +1,173 @@
+import { useState } from 'react';
+import {
+ DragDropContext,
+ Droppable,
+ Draggable,
+ OnDragEndResponder,
+ DraggableLocation,
+} from 'react-beautiful-dnd';
+
+type Task = {
+ id: string;
+ content: string;
+};
+// fake data generator
+const getItems = (count: number, offset = 0): Task[] =>
+ Array.from({ length: count }, (_, k) => k).map((k) => ({
+ id: `item-${k + offset}-${new Date().getTime()}`,
+ content: `item ${k + offset}`,
+ }));
+
+/**
+ * re order
+ *
+ * @param list
+ * @param startIndex
+ * @param endIndex
+ */
+const reorder = (list: Task[], startIndex: number, endIndex: number) => {
+ const result = Array.from(list);
+ const [removed] = result.splice(startIndex, 1);
+ result.splice(endIndex, 0, removed);
+
+ return result;
+};
+
+/**
+ * Moves an item from one list to another list.
+ */
+const move = (
+ source: Task[],
+ destination: Task[],
+ droppableSource: DraggableLocation,
+ droppableDestination: DraggableLocation,
+) => {
+ const sourceClone = Array.from(source);
+ const destClone = Array.from(destination);
+ const [removed] = sourceClone.splice(droppableSource.index, 1);
+
+ destClone.splice(droppableDestination.index, 0, removed);
+
+ const result: Record = {};
+ result[droppableSource.droppableId] = sourceClone;
+ result[droppableDestination.droppableId] = destClone;
+
+ return result;
+};
+const grid = 8;
+
+const getItemStyle = (isDragging: boolean, draggableStyle: any) => ({
+ // some basic styles to make the items look a bit nicer
+ userSelect: 'none',
+ padding: grid * 2,
+ margin: `0 0 ${grid}px 0`,
+
+ // change background colour if dragging
+ background: isDragging ? 'lightgreen' : 'grey',
+
+ // styles we need to apply on draggables
+ ...draggableStyle,
+});
+const getListStyle = (isDraggingOver: boolean) => ({
+ background: isDraggingOver ? 'lightblue' : 'lightgrey',
+ padding: grid,
+ width: 250,
+});
+
+export default function Kanban() {
+ const [state, setState] = useState([getItems(10), getItems(5, 10)]);
+
+ const onDragEnd: OnDragEndResponder = (result) => {
+ const { source, destination } = result;
+
+ // dropped outside the list
+ if (!destination) {
+ return;
+ }
+ const sInd = +source.droppableId;
+ const dInd = +destination.droppableId;
+
+ if (sInd === dInd) {
+ const items = reorder(state[sInd], source.index, destination.index);
+ const newState = [...state];
+ newState[sInd] = items;
+ setState(newState);
+ } else {
+ const result = move(state[sInd], state[dInd], source, destination);
+ const newState = [...state];
+ newState[sInd] = result[sInd];
+ newState[dInd] = result[dInd];
+
+ setState(newState.filter((group) => group.length));
+ }
+ };
+
+ return (
+
+
{
+ setState([...state, []]);
+ }}
+ >
+ Add new group
+
+
{
+ setState([...state, getItems(1)]);
+ }}
+ >
+ Add new item
+
+
+
onDragEnd}>
+ {state.map((el, ind) => (
+
+ {(provided, snapshot) => (
+
+ {el.map((item, index) => (
+
+ {(provided, snapshot) => (
+
+
+ {item.content}
+ {
+ const newState = [...state];
+ newState[ind].splice(index, 1);
+ setState(newState.filter((group) => group.length));
+ }}
+ >
+ delete
+
+
+
+ )}
+
+ ))}
+ {provided.placeholder}
+
+ )}
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/kanban/index.tsx b/src/pages/sys/others/kanban/index.tsx
new file mode 100644
index 0000000..a5872e7
--- /dev/null
+++ b/src/pages/sys/others/kanban/index.tsx
@@ -0,0 +1,280 @@
+import { faker } from '@faker-js/faker';
+import { Button, Input, InputRef } from 'antd';
+import { useRef, useState } from 'react';
+import { DragDropContext, DropResult, Droppable, OnDragEndResponder } from 'react-beautiful-dnd';
+import { useEvent } from 'react-use';
+import SimpleBar from 'simplebar-react';
+
+import { Iconify } from '@/components/icon';
+import KanbanColumn from '@/pages/sys/others/kanban/kanban-column';
+import {
+ Column,
+ Columns,
+ DndDataType,
+ DragType,
+ Task,
+ Tasks,
+} from '@/pages/sys/others/kanban/types';
+
+import { initialData } from './task-utils';
+
+export default function Kanban() {
+ const [state, setState] = useState(initialData);
+
+ // dragtype == task
+ const handleTaskDragEnd = (result: DropResult) => {
+ const { source, destination, draggableId } = result;
+ const start = state.columns[source.droppableId];
+ const finish = state.columns[destination!.droppableId];
+
+ if (start === finish) {
+ // moving task in one column
+ const newTaskIds = Array.from(start.taskIds);
+ newTaskIds.splice(source.index, 1);
+ newTaskIds.splice(destination!.index, 0, draggableId);
+
+ const newColumn: Column = {
+ ...start,
+ taskIds: newTaskIds,
+ };
+
+ const newState: DndDataType = {
+ ...state,
+ columns: {
+ ...state.columns,
+ [newColumn.id]: newColumn,
+ },
+ };
+
+ setState(newState);
+ } else {
+ // moving task from on column to another
+ const startTaskIds = Array.from(start.taskIds);
+ startTaskIds.splice(source.index, 1);
+ const newStart: Column = {
+ ...start,
+ taskIds: startTaskIds,
+ };
+
+ const finishTaskIds = Array.from(finish.taskIds);
+ finishTaskIds.splice(destination!.index, 0, draggableId);
+ const newFinish: Column = {
+ ...finish,
+ taskIds: finishTaskIds,
+ };
+
+ const newState: DndDataType = {
+ ...state,
+ columns: {
+ ...state.columns,
+ [newStart.id]: newStart,
+ [newFinish.id]: newFinish,
+ },
+ };
+
+ setState(newState);
+ }
+ };
+
+ // dragtype == column
+ const handleColumnDragEnd = (result: DropResult) => {
+ const { source, destination, draggableId } = result;
+
+ const newColumnOrder = Array.from(state.columnOrder);
+ newColumnOrder.splice(source.index, 1);
+ newColumnOrder.splice(destination!.index, 0, draggableId);
+ const newState: DndDataType = {
+ ...state,
+ columnOrder: newColumnOrder,
+ };
+ setState(newState);
+ };
+
+ const onDragEnd: OnDragEndResponder = (result) => {
+ const { source, destination, type } = result;
+ // Drag to an illegal non-droppable area
+ if (!destination) {
+ return;
+ }
+ // Drop in place
+ if (destination.droppableId === source.droppableId && destination.index === source.index) {
+ return;
+ }
+
+ if (type === DragType.COLUMN) {
+ handleColumnDragEnd(result);
+ } else {
+ handleTaskDragEnd(result);
+ }
+ };
+
+ const [addingColumn, setAddingColumn] = useState(false);
+ const inputRef = useRef(null);
+
+ const handleClickOutside = (event: MouseEvent) => {
+ if (inputRef.current && !inputRef.current.input?.contains(event.target as Node)) {
+ const inputVal = inputRef.current.input?.value;
+ if (inputVal) {
+ createColumn({
+ id: faker.string.uuid(),
+ title: inputVal,
+ taskIds: [],
+ });
+ }
+ setAddingColumn(false);
+ console.log('click outside');
+ }
+ };
+ useEvent('click', handleClickOutside);
+
+ const createColumn = (column: Column) => {
+ const newState: DndDataType = {
+ ...state,
+ columns: {
+ ...state.columns,
+ [column.id]: column,
+ },
+ columnOrder: [...state.columnOrder, column.id],
+ };
+ setState(newState);
+ };
+
+ const createTask = (columnId: string, task: Task) => {
+ const column = state.columns[columnId];
+ const newState: DndDataType = {
+ ...state,
+ tasks: {
+ ...state.tasks,
+ [task.id]: task,
+ },
+ columns: {
+ ...state.columns,
+ [columnId]: {
+ ...column,
+ taskIds: [...column.taskIds, task.id],
+ },
+ },
+ };
+ setState(newState);
+ };
+
+ const deletColumn = (columnId: string) => {
+ const column = state.columns[columnId];
+ const newTasks = Object.keys(state.tasks)
+ .filter((key) => !column.taskIds.includes(key))
+ .reduce((result, key) => {
+ result[key] = state.tasks[key];
+ return result;
+ }, {} as Tasks);
+
+ const newColumns = Object.keys(state.columns)
+ .filter((key) => key !== columnId)
+ .reduce((result, key) => {
+ result[key] = state.columns[key];
+ return result;
+ }, {} as Columns);
+ const newColumnOrder = Array.from(state.columnOrder).filter((item) => item !== columnId);
+
+ const newState: DndDataType = {
+ tasks: newTasks,
+ columns: newColumns,
+ columnOrder: newColumnOrder,
+ };
+ setState(newState);
+ };
+
+ const clearColumn = (columnId: string) => {
+ const column = state.columns[columnId];
+ const newTasks = Object.keys(state.tasks)
+ .filter((key) => !column.taskIds.includes(key))
+ .reduce((result, key) => {
+ result[key] = state.tasks[key];
+ return result;
+ }, {} as Tasks);
+ const newColumns = {
+ ...state.columns,
+ [columnId]: {
+ ...column,
+ taskIds: [],
+ },
+ };
+ const newState: DndDataType = {
+ ...state,
+ tasks: newTasks,
+ columns: newColumns,
+ };
+ setState(newState);
+ };
+
+ const renameColumn = (column: Column) => {
+ const { id, title } = column;
+ const newColumns = {
+ ...state.columns,
+ [id]: {
+ ...state.columns[id],
+ title,
+ },
+ };
+ const newState: DndDataType = {
+ ...state,
+ columns: newColumns,
+ };
+ setState(newState);
+ };
+
+ return (
+
+
+
+
+ {(provided) => (
+
+ {state.columnOrder.map((columnId, index) => {
+ const column = state.columns[columnId];
+ const tasks = column.taskIds.map((taskId) => state.tasks[taskId]);
+
+ return (
+
+ );
+ })}
+ {provided.placeholder}
+
+ )}
+
+
+
+
+ {addingColumn ? (
+
+ ) : (
+
{
+ e.stopPropagation();
+ setAddingColumn(true);
+ }}
+ className="!inline-flex !w-full items-center justify-center !text-xs !font-semibold"
+ block
+ size="large"
+ >
+
+ Add Column
+
+ )}
+
+
+
+ );
+}
diff --git a/src/pages/sys/others/kanban/kanban-column.tsx b/src/pages/sys/others/kanban/kanban-column.tsx
new file mode 100644
index 0000000..1bfc38e
--- /dev/null
+++ b/src/pages/sys/others/kanban/kanban-column.tsx
@@ -0,0 +1,179 @@
+import { faker } from '@faker-js/faker';
+import { Button, Dropdown, Input, InputRef, MenuProps } from 'antd';
+import { CSSProperties, useRef, useState } from 'react';
+import { Draggable, Droppable } from 'react-beautiful-dnd';
+import { useEvent } from 'react-use';
+
+import { Iconify } from '@/components/icon';
+import KanbanTask from '@/pages/sys/others/kanban/kanban-task';
+import { Column, DragType, Task, TaskPriority } from '@/pages/sys/others/kanban/types';
+import { useSettings } from '@/store/settingStore';
+
+import { ThemeMode } from '#/enum';
+
+type Props = {
+ index: number;
+ column: Column;
+ tasks: Task[];
+ createTask: (columnId: string, task: Task) => void;
+ clearColumn: (columnId: string) => void;
+ deleteColumn: (columnId: string) => void;
+ renameColumn: (column: Column) => void;
+};
+
+export default function KanbanColumn({
+ index,
+ column,
+ tasks,
+ createTask,
+ clearColumn,
+ deleteColumn,
+ renameColumn,
+}: Props) {
+ const { themeMode } = useSettings();
+
+ const style: CSSProperties = {
+ height: '100%',
+ padding: '16px',
+ borderRadius: '16px',
+ backgroundColor:
+ themeMode === ThemeMode.Light ? 'rgb(244, 246, 248)' : 'rgba(145, 158, 171, 0.12)',
+ };
+
+ const items: MenuProps['items'] = [
+ {
+ key: '1',
+ label: (
+ {
+ setRenamingTask(true);
+ }}
+ >
+
+ rename
+
+ ),
+ },
+ {
+ key: '2',
+ label: (
+ clearColumn(column.id)}>
+
+ clear
+
+ ),
+ },
+ {
+ key: '3',
+ label: (
+ deleteColumn(column.id)}>
+
+ delete
+
+ ),
+ },
+ ];
+
+ const [addingTask, setAddingTask] = useState(false);
+ const addTaskInputRef = useRef(null);
+ const handleClickOutside = (event: MouseEvent) => {
+ if (addTaskInputRef.current && !addTaskInputRef.current.input?.contains(event.target as Node)) {
+ const addTaskInputVal = addTaskInputRef.current.input?.value;
+ if (addTaskInputVal) {
+ createTask(column.id, {
+ id: faker.string.uuid(),
+ title: addTaskInputVal,
+ reporter: faker.image.avatarGitHub(),
+ priority: faker.helpers.enumValue(TaskPriority),
+ });
+ }
+ setAddingTask(false);
+ }
+
+ if (
+ renameTaskInputRef.current &&
+ !renameTaskInputRef.current.input?.contains(event.target as Node)
+ ) {
+ const renameInputVal = renameTaskInputRef.current.input?.value;
+ if (renameInputVal) {
+ renameColumn({
+ ...column,
+ title: renameInputVal,
+ });
+ }
+ setRenamingTask(false);
+ }
+ };
+ useEvent('click', handleClickOutside);
+
+ const [renamingTask, setRenamingTask] = useState(false);
+ const renameTaskInputRef = useRef(null);
+ const [dropdownOpen, setDropdownOpen] = useState(false);
+ const handleMenuItemClick = (menuInfo: any) => {
+ setDropdownOpen(false);
+ menuInfo.domEvent.stopPropagation();
+ };
+ return (
+
+ {(provided) => (
+
+
+
+
+
+ {(provided) => (
+
+ {tasks.map((task, index) => (
+
+ ))}
+ {provided.placeholder}
+
+ )}
+
+
+
+
+
+ )}
+
+ );
+}
diff --git a/src/pages/sys/others/kanban/kanban-task.tsx b/src/pages/sys/others/kanban/kanban-task.tsx
new file mode 100644
index 0000000..eff8e7f
--- /dev/null
+++ b/src/pages/sys/others/kanban/kanban-task.tsx
@@ -0,0 +1,173 @@
+import { Avatar, Drawer, Image, Select } from 'antd';
+import Color from 'color';
+import { CSSProperties, memo, useState } from 'react';
+import { Draggable } from 'react-beautiful-dnd';
+import styled from 'styled-components';
+
+import CyanBlur from '@/assets/images/background/cyan-blur.png';
+import RedBlur from '@/assets/images/background/red-blur.png';
+import { IconButton, Iconify, SvgIcon } from '@/components/icon';
+import { Task, TaskPriority } from '@/pages/sys/others/kanban/types';
+import { useSettings } from '@/store/settingStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import TaskDetail from './task-detail';
+
+import { ThemeMode } from '#/enum';
+
+type Props = {
+ index: number;
+ task: Task;
+};
+function KanbanTask({ index, task }: Props) {
+ const { themeMode } = useSettings();
+ const [drawerOpen, setDrawerOpen] = useState(false);
+ const themeToken = useThemeToken();
+
+ const style: CSSProperties = {
+ backdropFilter: 'blur(20px)',
+ backgroundImage: `url("${CyanBlur}"), url("${RedBlur}")`,
+ backgroundRepeat: 'no-repeat, no-repeat',
+ backgroundColor: Color(themeToken.colorBgContainer).alpha(0.9).toString(),
+ backgroundPosition: 'right top, left bottom',
+ backgroundSize: '50, 50%',
+ };
+
+ const { id, title, comments = [], attachments = [], priority, assignee } = task;
+ return (
+ <>
+
+ {(provided, snapshot) => (
+
+
+ {attachments.length > 0 && (
+
+ )}
+
setDrawerOpen(true)}>
+
+
+
+
{title}
+
+
+
+ {comments.length}
+
+
+ {attachments.length}
+
+
+ {assignee?.length && (
+
+ {assignee.map((url) => (
+
+ ))}
+
+ )}
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ onClose={() => setDrawerOpen(false)}
+ open={drawerOpen}
+ closable={false}
+ width={420}
+ styles={{
+ body: { padding: 0 },
+ mask: { backgroundColor: 'transparent' },
+ }}
+ style={style}
+ >
+
+
+ >
+ );
+}
+
+// It is important to use memo here because you should not render internal tasks repeatedly for drag columns
+export default memo(KanbanTask);
+
+type TaskPrioritySvgProps = {
+ taskPriority: TaskPriority;
+};
+function TaskPrioritySvg({ taskPriority }: TaskPrioritySvgProps) {
+ const { colorSuccess, colorInfo, colorWarning } = useThemeToken();
+ switch (taskPriority) {
+ case TaskPriority.HIGH:
+ return ;
+ case TaskPriority.MEDIUM:
+ return ;
+ case TaskPriority.LOW:
+ return ;
+ default:
+ break;
+ }
+}
+const Container = styled.div<{ $isDragging: boolean; $themeMode: ThemeMode }>`
+ width: 248px;
+ border-radius: 12px;
+ padding: 16px;
+ margin-bottom: 16px;
+ font-weight: 400;
+ font-size: 12px;
+ background-color: ${(props) => {
+ if (props.$themeMode === ThemeMode.Light) {
+ return props.$isDragging ? 'rgba(255, 255, 255, 0.48)' : 'rgb(255, 255, 255)';
+ }
+ return props.$isDragging ? 'rgba(22, 28, 36, 0.48)' : 'rgb(22, 28, 36)';
+ }};
+ backdrop-filter: ${(props) => (props.$isDragging ? `blur(6px)` : '')};
+
+ &:hover {
+ box-shadow: ${(props) =>
+ props.$themeMode === ThemeMode.Light
+ ? 'rgba(145, 158, 171, 0.16) 0px 20px 40px -4px'
+ : 'rgba(0, 0, 0, 0.16) 0px 20px 40px -4px'};
+ }
+`;
diff --git a/src/pages/sys/others/kanban/task-detail.tsx b/src/pages/sys/others/kanban/task-detail.tsx
new file mode 100644
index 0000000..54dd398
--- /dev/null
+++ b/src/pages/sys/others/kanban/task-detail.tsx
@@ -0,0 +1,143 @@
+import { Avatar, DatePicker, Input, Radio, Space, Image, Typography } from 'antd';
+import dayjs from 'dayjs';
+import styled from 'styled-components';
+
+import { SvgIcon } from '@/components/icon';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+import { Task } from './types';
+
+type Props = {
+ task: Task;
+};
+export default function TaskDetail({ task }: Props) {
+ const {
+ title,
+ reporter,
+ assignee = [],
+ tags = [],
+ date,
+ priority,
+ description,
+ attachments,
+ comments = [],
+ } = task;
+ const { colorInfo, colorWarning, colorSuccess } = useThemeToken();
+ return (
+ <>
+
+
+ {title}
+
+
+
+
Assignee
+
+
+ {assignee.map((item, index) => (
+
+ ))}
+
+
+
+
Tag
+
+ {tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+
+
+
Priority
+
+
+
+
+
+ High
+
+
+
+
+ Medium
+
+
+
+
+ Low
+
+
+
+
+
+
+
+
+
+
Attachments
+
+ {attachments?.map((item) => (
+
+ ))}
+
+
+
+ {/* comments */}
+
+ {comments?.map(({ avatar, username, content, time }) => (
+
+
+
+
+ {username}
+ {dayjs(time).format('DD/MM/YYYY HH:mm')}
+
+
{content}
+
+
+ ))}
+
+ >
+ );
+}
+
+const Container = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ padding: 24px 20px 40px;
+ .item {
+ display: flex;
+ align-items: center;
+ }
+ .label {
+ text-align: left;
+ font-size: 0.75rem;
+ font-weight: 600;
+ width: 100px;
+ flex-shrink: 0;
+ color: rgb(99, 115, 129);
+ height: 40px;
+ line-height: 40px;
+ }
+`;
diff --git a/src/pages/sys/others/kanban/task-utils.ts b/src/pages/sys/others/kanban/task-utils.ts
new file mode 100644
index 0000000..266ce20
--- /dev/null
+++ b/src/pages/sys/others/kanban/task-utils.ts
@@ -0,0 +1,138 @@
+import { faker } from '@faker-js/faker';
+
+import { TaskPriority, TaskComment, TaskTag, DndDataType } from './types';
+
+const fakeComment = (count: number): TaskComment[] => {
+ const result = [];
+ for (let index = 0; index < count; index += 1) {
+ result.push({
+ username: faker.person.fullName(),
+ avatar: faker.image.avatarLegacy(),
+ content: faker.lorem.lines({ min: 1, max: 3 }),
+ time: faker.date.past(),
+ });
+ }
+ return result;
+};
+
+const fakeAttachment = (count: number) => {
+ const result = [];
+ for (let index = 0; index < count; index += 1) {
+ result.push(faker.image.urlPicsumPhotos());
+ }
+ return result;
+};
+
+const fakeAssignee = (count: number) => {
+ const result = [];
+ for (let index = 0; index < count; index += 1) {
+ result.push(faker.image.avatarLegacy());
+ }
+ return result;
+};
+
+const fakeTag = (count: number) => {
+ const uniqueArray = [];
+ const set = new Set();
+
+ while (uniqueArray.length < count) {
+ const randomElement = faker.helpers.enumValue(TaskTag);
+ if (!set.has(randomElement)) {
+ uniqueArray.push(randomElement);
+ set.add(randomElement);
+ }
+ }
+
+ return uniqueArray;
+};
+
+export const initialData: DndDataType = {
+ tasks: {
+ 'task-1': {
+ id: 'task-1',
+ title: faker.lorem.words(3),
+ reporter: faker.image.avatarLegacy(),
+ priority: TaskPriority.LOW,
+ tags: [],
+ comments: [],
+ attachments: [],
+ },
+ 'task-2': {
+ id: 'task-2',
+ title: faker.lorem.words(3),
+ reporter: faker.image.avatarLegacy(),
+ assignee: fakeAssignee(1),
+ date: faker.date.future(),
+ priority: TaskPriority.HIGH,
+ tags: fakeTag(3),
+ comments: fakeComment(1),
+ attachments: fakeAttachment(4),
+ },
+ 'task-3': {
+ id: 'task-3',
+ title: faker.lorem.words(4),
+ reporter: faker.image.avatarLegacy(),
+ assignee: fakeAssignee(2),
+ priority: TaskPriority.MEDIUM,
+ date: faker.date.future(),
+ tags: fakeTag(2),
+ comments: fakeComment(2),
+ attachments: [],
+ },
+ 'task-4': {
+ id: 'task-4',
+ title: faker.lorem.words(5),
+ reporter: faker.image.avatar(),
+ assignee: fakeAssignee(3),
+ priority: TaskPriority.MEDIUM,
+ tags: fakeTag(3),
+ date: faker.date.future(),
+ description: faker.lorem.lines(5),
+ attachments: [],
+ comments: fakeComment(3),
+ },
+ 'task-5': {
+ id: 'task-5',
+ title: faker.lorem.words(4),
+ reporter: faker.image.avatar(),
+ priority: TaskPriority.HIGH,
+ assignee: fakeAssignee(4),
+ tags: fakeTag(4),
+ date: faker.date.future(),
+ description: faker.lorem.lines(3),
+ attachments: [],
+ comments: fakeComment(4),
+ },
+ 'task-6': {
+ id: 'task-6',
+ title: faker.lorem.words(5),
+ reporter: faker.image.avatar(),
+ priority: TaskPriority.LOW,
+
+ assignee: fakeAssignee(5),
+ tags: fakeTag(5),
+ date: faker.date.future(),
+ description: faker.lorem.lines(4),
+ attachments: fakeAttachment(5),
+ comments: fakeComment(4),
+ },
+ },
+ columns: {
+ 'column-1': {
+ id: 'column-1',
+ title: 'To do',
+ taskIds: ['task-1', 'task-2', 'task-3'],
+ },
+ 'column-2': {
+ id: 'column-2',
+ title: 'In progress',
+ taskIds: ['task-4', 'task-5'],
+ },
+ 'column-3': {
+ id: 'column-3',
+ title: 'Done',
+ taskIds: ['task-6'],
+ },
+ },
+ columnOrder: ['column-1', 'column-2', 'column-3'],
+};
diff --git a/src/pages/sys/others/kanban/types.ts b/src/pages/sys/others/kanban/types.ts
new file mode 100644
index 0000000..3419ab9
--- /dev/null
+++ b/src/pages/sys/others/kanban/types.ts
@@ -0,0 +1,56 @@
+export enum TaskPriority {
+ LOW = 'Low',
+ MEDIUM = 'Medium',
+ HIGH = 'High',
+}
+
+export enum TaskTag {
+ frontend = 'FrontEnd',
+ backend = 'BackEnd',
+ fullstack = 'FullStack',
+ DevOps = 'DevOps',
+ AI = 'AI',
+ DBA = 'DBA',
+ UI = 'UI',
+ UE = 'UE',
+ QA = 'QA',
+}
+
+export type TaskComment = {
+ username: string;
+ avatar: string;
+ content: string;
+ time: Date;
+};
+
+export type Task = {
+ id: string;
+ title: string;
+ reporter: string; // avatar
+ priority: TaskPriority;
+ assignee?: string[]; // avatar array
+ tags?: string[];
+ date?: Date;
+ description?: string;
+ comments?: TaskComment[];
+ attachments?: string[];
+};
+export type Tasks = Record;
+
+export type Column = {
+ id: string;
+ title: string;
+ taskIds: string[];
+};
+export type Columns = Record;
+
+export type DndDataType = {
+ tasks: Tasks;
+ columns: Columns;
+ columnOrder: string[];
+};
+
+export enum DragType {
+ COLUMN = 'column',
+ TASK = 'task',
+}
diff --git a/src/pages/text-advertising/columnConfig.tsx b/src/pages/text-advertising/columnConfig.tsx
new file mode 100644
index 0000000..0955a70
--- /dev/null
+++ b/src/pages/text-advertising/columnConfig.tsx
@@ -0,0 +1,95 @@
+import { Button, Space, TableProps } from 'antd';
+import dayjs from 'dayjs';
+
+import { IAdvertisingItem } from './index';
+
+const getColumns = (
+ handleEdit: (record: IAdvertisingItem) => void,
+ handleDelete: (id: string) => void,
+) => {
+ const columns: TableProps['columns'] = [
+ {
+ title: 'adsId',
+ dataIndex: 'adsId',
+ width: '200px',
+ key: 'adsId',
+ render: (text) => {text} ,
+ },
+ {
+ title: 'Advertising name',
+ dataIndex: 'head',
+ key: 'head',
+ },
+ {
+ title: 'describe',
+ dataIndex: 'adsText',
+ width: '300px',
+ key: 'adsText',
+ },
+ {
+ title: 'link',
+ dataIndex: 'clickLink',
+ key: 'clickLink',
+ render: (text) => (
+
+ {text}
+
+ ),
+ },
+ {
+ title: 'page',
+ dataIndex: 'labels',
+ width: '400px',
+ key: 'labels',
+ render: (text) => (
+
+
+ {text.map((item: string) => {
+ return {item} ;
+ })}
+
+
+ ),
+ },
+ {
+ title: 'Impressions',
+ dataIndex: 'totalVisitCount',
+ key: 'totalVisitCount',
+ },
+ {
+ title: 'createTime',
+ dataIndex: 'createTime',
+ key: 'createTime',
+ render: (text) => {dayjs(text).format('YYYY-MM-DD HH:mm:ss')} ,
+ },
+ {
+ title: 'Action',
+ key: 'action',
+ fixed: 'right',
+ render: (_, record) => (
+
+ {
+ handleEdit(record);
+ }}
+ >
+ edit
+
+ {
+ handleDelete(record.adsId);
+ }}
+ >
+ Delete
+
+
+ ),
+ },
+ ];
+
+ return columns;
+};
+
+export default getColumns;
diff --git a/src/pages/text-advertising/index.tsx b/src/pages/text-advertising/index.tsx
new file mode 100644
index 0000000..803198a
--- /dev/null
+++ b/src/pages/text-advertising/index.tsx
@@ -0,0 +1,429 @@
+import { ExclamationCircleFilled } from '@ant-design/icons';
+import {
+ Button,
+ Checkbox,
+ Col,
+ DatePicker,
+ Form,
+ Input,
+ message,
+ Modal,
+ Row,
+ Select,
+ Space,
+ Table,
+ TableProps,
+} from 'antd';
+import dayjs from 'dayjs';
+import advancedFormat from 'dayjs/plugin/advancedFormat';
+import customParseFormat from 'dayjs/plugin/customParseFormat';
+import localeData from 'dayjs/plugin/localeData';
+import dayjsPluginUTC from 'dayjs/plugin/utc';
+import weekday from 'dayjs/plugin/weekday';
+import weekOfYear from 'dayjs/plugin/weekOfYear';
+import weekYear from 'dayjs/plugin/weekYear';
+import { useCallback, useEffect, useState } from 'react';
+
+import advertisingService from '@/api/services/advertisingService';
+import { Upload } from '@/components/upload';
+import { useAWSUploadService } from '@/hooks/useAWSUploadService';
+import { advertisingCounts, advertisingLabels } from '@/utils/contant';
+
+import getColumns from './columnConfig';
+
+import { TableParams } from '#/entity';
+
+dayjs.extend(dayjsPluginUTC);
+
+const { Option } = Select;
+const { RangePicker } = DatePicker;
+
+dayjs.extend(customParseFormat);
+dayjs.extend(advancedFormat);
+dayjs.extend(weekday);
+dayjs.extend(localeData);
+dayjs.extend(weekOfYear);
+dayjs.extend(weekYear);
+
+const formItemLayout = {
+ labelCol: {
+ xs: { span: 24 },
+ sm: { span: 9 },
+ },
+ wrapperCol: {
+ xs: { span: 24 },
+ sm: { span: 14 },
+ },
+};
+
+const { confirm } = Modal;
+
+export interface IAdvertisingItem {
+ adsId: string;
+ head: string;
+ logo: string;
+ adsText: string;
+ clickText: string;
+ clickLink: string;
+ labels: Array;
+ createTime: string;
+ updateTime: string;
+ startTime: number;
+ endTime: number;
+ totalVisitCount: number;
+ id: string;
+}
+
+export default function Page() {
+ const [form] = Form.useForm();
+ const [queryForm] = Form.useForm();
+
+ const [loading, setLoading] = useState(true);
+
+ const [data, setData] = useState>([]);
+ const [confirmLoading, setConfirmLoading] = useState(false);
+ const [modelLoading, setModelLoading] = useState(false);
+
+ const [adsId, setAdsId] = useState('');
+
+ const [tableParams, setTableParams] = useState({
+ pagination: {
+ current: 1,
+ pageSize: 10,
+ },
+ });
+
+ const fetchData = useCallback(async () => {
+ setLoading(true);
+ const queryData = queryForm.getFieldsValue();
+ try {
+ const data = await advertisingService.getTextAdvertisingList({
+ labels: queryData.labels || undefined,
+ adsId: queryData.adsId || undefined,
+ });
+ setData(data.list);
+ setTableParams({
+ pagination: {
+ current: 1,
+ pageSize: tableParams.pagination?.pageSize,
+ },
+ });
+ } catch (error) {
+ console.log(error);
+ } finally {
+ setLoading(false);
+ }
+ }, [queryForm, tableParams.pagination?.pageSize]);
+
+ const showModal = () => {
+ setAdsId('');
+ form.resetFields();
+ setOpen(true);
+ };
+
+ const [open, setOpen] = useState(false);
+
+ const { awsUploadFile } = useAWSUploadService();
+ const onFinish = async (values: any) => {
+ setConfirmLoading(true);
+ const originLogo = values.logo[0];
+ let logo = '';
+ try {
+ if (originLogo.url) {
+ logo = originLogo.url;
+ } else {
+ const uploadFile = await awsUploadFile(originLogo.originFileObj as File);
+ logo = uploadFile;
+ }
+ } catch (error) {
+ message.error('aws upload error');
+ }
+
+ const startTime = dayjs(values.dateRange[0]).valueOf();
+ const endTime = dayjs(values.dateRange[1]).valueOf();
+ const data = {
+ ...values,
+ startTime,
+ endTime,
+ logo,
+ adsId,
+ };
+ delete data.dateRange;
+ try {
+ await advertisingService.addTextAdvertising(data);
+ if (!adsId) {
+ message.success('add success');
+ } else {
+ message.success('edit success');
+ }
+ setOpen(false);
+ setConfirmLoading(false);
+ fetchData();
+ } catch (error) {
+ message.error('add error');
+ setConfirmLoading(false);
+ }
+ };
+
+ const handleOk = () => {
+ form.submit();
+ };
+
+ const handleSearch = () => {
+ fetchData();
+ };
+
+ const handleSearchSet = () => {
+ queryForm.resetFields();
+ fetchData();
+ };
+
+ const handleCancel = () => {
+ setOpen(false);
+ };
+
+ useEffect(() => {
+ fetchData();
+ }, [fetchData]);
+
+ const [messageApi, contextHolder] = message.useMessage();
+
+ const handleEdit = async (params: IAdvertisingItem) => {
+ setModelLoading(true);
+ setOpen(true);
+ const data = await advertisingService.getTextAdvertisingList({
+ adsId: params.adsId,
+ });
+ setAdsId(params.adsId);
+ const adsItem = data.list[0];
+ const dateRange = adsItem.startTime ? [dayjs(adsItem.startTime), dayjs(adsItem.endTime)] : [];
+ const regexFilename = /[^/]+$/;
+ const matchFilename = adsItem.logo.match(regexFilename);
+ const fullFilename = matchFilename ? matchFilename[0] : null;
+
+ form.setFieldsValue({
+ ...adsItem,
+ dateRange,
+ logo: adsItem.logo
+ ? [
+ {
+ uid: '-1',
+ name: fullFilename,
+ status: 'done',
+ url: adsItem.logo,
+ },
+ ]
+ : [],
+ });
+
+ setModelLoading(false);
+ };
+
+ const handleTableChange: TableProps['onChange'] = (pagination) => {
+ setTableParams({
+ pagination,
+ });
+
+ // `dataSource` is useless since `pageSize` changed
+ if (pagination.pageSize !== tableParams.pagination?.pageSize) {
+ setData([]);
+ }
+ };
+
+ const handleDelete = (adsId: string) => {
+ confirm({
+ title: 'confirm',
+ icon: ,
+ content: `Are you sure you want to delete this AD with AD id ${adsId} ?`,
+ onOk() {
+ return new Promise((resolve, reject) => {
+ advertisingService
+ .delTextAdvertising({ adsId })
+ .then(() => {
+ fetchData();
+ resolve(true);
+ messageApi.success('Delete successfully');
+ })
+ .catch((err) => {
+ reject(err);
+ messageApi.error(err?.message);
+ });
+ }).catch(() => console.log('Oops errors!'));
+ },
+ onCancel() {},
+ });
+ };
+
+ const columns = getColumns(handleEdit, handleDelete);
+
+ return (
+
+ );
+}
diff --git a/src/router/components/auth-guard.tsx b/src/router/components/auth-guard.tsx
new file mode 100644
index 0000000..dfc22f8
--- /dev/null
+++ b/src/router/components/auth-guard.tsx
@@ -0,0 +1,27 @@
+import { useCallback, useEffect } from 'react';
+import { ErrorBoundary } from 'react-error-boundary';
+
+import PageError from '@/pages/sys/error/PageError';
+import { useUserToken } from '@/store/userStore';
+
+import { useRouter } from '../hooks';
+
+type Props = {
+ children: React.ReactNode;
+};
+export default function AuthGuard({ children }: Props) {
+ const router = useRouter();
+ const { access_token: accessToken } = useUserToken();
+
+ const check = useCallback(() => {
+ if (!accessToken) {
+ router.replace('/login');
+ }
+ }, [router, accessToken]);
+
+ useEffect(() => {
+ check();
+ }, [check]);
+
+ return {children} ;
+}
diff --git a/src/router/hooks/index.ts b/src/router/hooks/index.ts
new file mode 100644
index 0000000..f0cf881
--- /dev/null
+++ b/src/router/hooks/index.ts
@@ -0,0 +1,8 @@
+export { useParams } from './use-params';
+export { usePathname } from './use-pathname';
+export { useSearchParams } from './use-search-params';
+export { useRouter } from './use-router';
+export { useRouteToMenuFn } from './use-route-to-menu';
+export { usePermissionRoutes } from './use-permission-routes';
+export { useCurrentRouteMeta } from './use-current-route-meta';
+export { useFlattenedRoutes } from './use-flattened-routes';
diff --git a/src/router/hooks/use-current-route-meta.tsx b/src/router/hooks/use-current-route-meta.tsx
new file mode 100644
index 0000000..e02d8fc
--- /dev/null
+++ b/src/router/hooks/use-current-route-meta.tsx
@@ -0,0 +1,78 @@
+import { isEmpty } from 'ramda';
+import { useEffect, useState } from 'react';
+import { Params, useMatches, useOutlet } from 'react-router-dom';
+
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import { useFlattenedRoutes } from './use-flattened-routes';
+import { useRouter } from './use-router';
+
+import type { RouteMeta } from '#/router';
+
+/**
+ * Return Meta information about the current route
+ */
+export function useCurrentRouteMeta() {
+ // const pathname = usePathname();
+ const { push } = useRouter();
+
+ // Get the routing component instance
+ const children = useOutlet();
+
+ // Get all matching routes
+ const matchs = useMatches();
+
+ // Get the routing menu after the pat is flattened
+ const flattenedRoutes = useFlattenedRoutes();
+
+ const [currentRouteMeta, setCurrentRouteMeta] = useState();
+
+ useEffect(() => {
+ // Gets the current matched route
+ const lastRoute = matchs.at(-1);
+ if (!lastRoute) return;
+
+ const { pathname, params } = lastRoute;
+ const matchedRouteMeta = flattenedRoutes.find((item) => {
+ const replacedKey = replaceDynamicParams(item.key, params);
+ return replacedKey === pathname || `${replacedKey}/` === pathname;
+ });
+
+ if (matchedRouteMeta) {
+ matchedRouteMeta.outlet = children;
+ if (!isEmpty(params)) {
+ matchedRouteMeta.params = params;
+ }
+ setCurrentRouteMeta({ ...matchedRouteMeta });
+ } else {
+ push(APP_HOMEPAGE);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [matchs]);
+
+ return currentRouteMeta;
+}
+
+/**
+ * replace `user/:id` to `/user/1234512345`
+ */
+export const replaceDynamicParams = (menuKey: string, params: Params) => {
+ let replacedPathName = menuKey;
+
+ // Parses the parameter names in the route path
+ const paramNames = menuKey.match(/:\w+/g);
+
+ if (paramNames) {
+ paramNames.forEach((paramName) => {
+ // Remove the colon and get the parameter name
+ const paramKey = paramName.slice(1);
+ // Check whether this parameter exists in the params object
+ if (params[paramKey]) {
+ // Replace the parameters in the path with the values in params
+ replacedPathName = replacedPathName.replace(paramName, params[paramKey]!);
+ }
+ });
+ }
+
+ return replacedPathName;
+};
diff --git a/src/router/hooks/use-flattened-routes.ts b/src/router/hooks/use-flattened-routes.ts
new file mode 100644
index 0000000..77cc21e
--- /dev/null
+++ b/src/router/hooks/use-flattened-routes.ts
@@ -0,0 +1,17 @@
+import { useCallback, useMemo } from 'react';
+
+import { flattenMenuRoutes, menuFilter } from '../utils';
+
+import { usePermissionRoutes } from './use-permission-routes';
+
+/**
+ *
+ */
+export function useFlattenedRoutes() {
+ const flattenRoutes = useCallback(flattenMenuRoutes, []);
+ const permissionRoutes = usePermissionRoutes();
+ return useMemo(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ return flattenRoutes(menuRoutes);
+ }, [flattenRoutes, permissionRoutes]);
+}
diff --git a/src/router/hooks/use-params.ts b/src/router/hooks/use-params.ts
new file mode 100644
index 0000000..cb09b62
--- /dev/null
+++ b/src/router/hooks/use-params.ts
@@ -0,0 +1,8 @@
+import { useMemo } from 'react';
+import { useParams as _useParams } from 'react-router-dom';
+
+export function useParams() {
+ const params = _useParams();
+
+ return useMemo(() => params, [params]);
+}
diff --git a/src/router/hooks/use-pathname.ts b/src/router/hooks/use-pathname.ts
new file mode 100644
index 0000000..2f2df8e
--- /dev/null
+++ b/src/router/hooks/use-pathname.ts
@@ -0,0 +1,8 @@
+import { useMemo } from 'react';
+import { useLocation } from 'react-router-dom';
+
+export function usePathname() {
+ const { pathname } = useLocation();
+
+ return useMemo(() => pathname, [pathname]);
+}
diff --git a/src/router/hooks/use-permission-routes.tsx b/src/router/hooks/use-permission-routes.tsx
new file mode 100644
index 0000000..3e40779
--- /dev/null
+++ b/src/router/hooks/use-permission-routes.tsx
@@ -0,0 +1,151 @@
+import { isEmpty } from 'ramda';
+import { Suspense, lazy, useMemo } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { Iconify } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+import { useUserPermission } from '@/store/userStore';
+import ProTag from '@/theme/antd/components/tag';
+import { flattenTrees } from '@/utils/tree';
+
+import { Permission } from '#/entity';
+import { BasicStatus, PermissionType } from '#/enum';
+import { AppRouteObject } from '#/router';
+
+// Use import.meta-.glob to get all the routing components
+const entryPath = '/src/pages';
+const pages = import.meta.glob('/src/pages/**/*.tsx');
+export const pagesSelect = Object.entries(pages).map(([path]) => {
+ const pagePath = path.replace(entryPath, '');
+ return {
+ label: pagePath,
+ value: pagePath,
+ };
+});
+
+// A function that builds the absolute path
+function resolveComponent(path: string) {
+ return pages[`${entryPath}${path}`];
+}
+
+/**
+ * return routes about permission
+ */
+export function usePermissionRoutes() {
+ // Switch back to the static route
+ // return useMemo(() => {
+ // return getRoutesFromModules();
+ // }, []);
+
+ const permissions = useUserPermission();
+
+ return useMemo(() => {
+ const flattenedPermissions = flattenTrees(permissions!);
+ const permissionRoutes = transformPermissionToMenuRoutes(
+ permissions || [],
+ flattenedPermissions,
+ );
+ return [...permissionRoutes];
+ }, [permissions]);
+}
+
+/**
+ * transform Permission[] to AppRouteObject[]
+ * @param permissions
+ * @param parent
+ */
+function transformPermissionToMenuRoutes(
+ permissions: Permission[],
+ flattenedPermissions: Permission[],
+) {
+ return permissions.map((permission) => {
+ const {
+ route,
+ type,
+ label,
+ icon,
+ order,
+ hide,
+ hideTab,
+ status,
+ frameSrc,
+ newFeature,
+ component,
+ parentId,
+ children = [],
+ } = permission;
+
+ const appRoute: AppRouteObject = {
+ path: route,
+ meta: {
+ label,
+ key: getCompleteRoute(permission, flattenedPermissions),
+ hideMenu: !!hide,
+ hideTab,
+ disabled: status === BasicStatus.DISABLE,
+ },
+ };
+
+ if (order) appRoute.order = order;
+ if (icon) appRoute.meta!.icon = icon;
+ if (frameSrc) appRoute.meta!.frameSrc = frameSrc;
+
+ if (newFeature) {
+ appRoute.meta!.suffix = (
+ }>
+ NEW
+
+ );
+ }
+
+ if (type === PermissionType.CATALOGUE) {
+ appRoute.meta!.hideTab = true;
+ if (!parentId) {
+ appRoute.element = (
+ }>
+
+
+ );
+ }
+ appRoute.children = transformPermissionToMenuRoutes(children, flattenedPermissions);
+
+ if (!isEmpty(children)) {
+ appRoute.children.unshift({
+ index: true,
+ element: ,
+ });
+ }
+ } else if (type === PermissionType.MENU) {
+ const Element = lazy(resolveComponent(component!) as any);
+ if (frameSrc) {
+ appRoute.element = ;
+ } else {
+ appRoute.element = (
+ }>
+
+
+ );
+ }
+ }
+
+ return appRoute;
+ });
+}
+
+/**
+ * Splicing from the root permission route to the current permission route
+ * @param {Permission} permission - current permission
+ * @param {Permission[]} flattenedPermissions - flattened permission array
+ * @param {string} route - parent permission route
+ * @returns {string} - The complete route after splicing
+ */
+function getCompleteRoute(permission: Permission, flattenedPermissions: Permission[], route = '') {
+ const currentRoute = route ? `/${permission.route}${route}` : `/${permission.route}`;
+
+ if (permission.parentId) {
+ const parentPermission = flattenedPermissions.find((p) => p.id === permission.parentId)!;
+ return getCompleteRoute(parentPermission, flattenedPermissions, currentRoute);
+ }
+
+ return currentRoute;
+}
diff --git a/src/router/hooks/use-route-to-menu.tsx b/src/router/hooks/use-route-to-menu.tsx
new file mode 100644
index 0000000..69b7502
--- /dev/null
+++ b/src/router/hooks/use-route-to-menu.tsx
@@ -0,0 +1,59 @@
+import { useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { Iconify, SvgIcon } from '@/components/icon';
+import { useSettings } from '@/store/settingStore';
+
+import { ThemeLayout } from '#/enum';
+import { AppRouteObject } from '#/router';
+import type { ItemType } from 'antd/es/menu/interface';
+
+/**
+ * routes -> menus
+ */
+export function useRouteToMenuFn() {
+ const { t } = useTranslation();
+ const { themeLayout } = useSettings();
+ const routeToMenuFn = useCallback(
+ (items: AppRouteObject[]) => {
+ return items
+ .filter((item) => !item.meta?.hideMenu)
+ .map((item) => {
+ const menuItem: any = [];
+ const { meta, children } = item;
+ if (meta) {
+ const { key, label, icon, disabled, suffix } = meta;
+ menuItem.key = key;
+ menuItem.disabled = disabled;
+ menuItem.label = (
+
+
{t(label)}
+ {suffix}
+
+ );
+ if (icon) {
+ if (typeof icon === 'string') {
+ if (icon.startsWith('ic')) {
+ menuItem.icon = ;
+ } else {
+ menuItem.icon = ;
+ }
+ } else {
+ menuItem.icon = icon;
+ }
+ }
+ }
+ if (children) {
+ menuItem.children = routeToMenuFn(children);
+ }
+ return menuItem as ItemType;
+ });
+ },
+ [t, themeLayout],
+ );
+ return routeToMenuFn;
+}
diff --git a/src/router/hooks/use-router.ts b/src/router/hooks/use-router.ts
new file mode 100644
index 0000000..bc99bf2
--- /dev/null
+++ b/src/router/hooks/use-router.ts
@@ -0,0 +1,19 @@
+import { useMemo } from 'react';
+import { useNavigate } from 'react-router-dom';
+
+export function useRouter() {
+ const navigate = useNavigate();
+
+ const router = useMemo(
+ () => ({
+ back: () => navigate(-1),
+ forward: () => navigate(1),
+ reload: () => window.location.reload(),
+ push: (href: string) => navigate(href),
+ replace: (href: string) => navigate(href, { replace: true }),
+ }),
+ [navigate],
+ );
+
+ return router;
+}
diff --git a/src/router/hooks/use-search-params.ts b/src/router/hooks/use-search-params.ts
new file mode 100644
index 0000000..478e94c
--- /dev/null
+++ b/src/router/hooks/use-search-params.ts
@@ -0,0 +1,8 @@
+import { useMemo } from 'react';
+import { useSearchParams as _useSearchParams } from 'react-router-dom';
+
+export function useSearchParams() {
+ const [searchParams] = _useSearchParams();
+
+ return useMemo(() => searchParams, [searchParams]);
+}
diff --git a/src/router/index.tsx b/src/router/index.tsx
new file mode 100644
index 0000000..bd5cc62
--- /dev/null
+++ b/src/router/index.tsx
@@ -0,0 +1,44 @@
+import { lazy } from 'react';
+import { Navigate, RouteObject, RouterProvider, createBrowserRouter } from 'react-router-dom';
+
+import DashboardLayout from '@/layouts/dashboard';
+import AuthGuard from '@/router/components/auth-guard';
+import { usePermissionRoutes } from '@/router/hooks';
+import { ErrorRoutes } from '@/router/routes/error-routes';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import { AppRouteObject } from '#/router';
+
+const LoginRoute: AppRouteObject = {
+ path: '/login',
+ Component: lazy(() => import('@/pages/sys/login/Login')),
+};
+const PAGE_NOT_FOUND_ROUTE: AppRouteObject = {
+ path: '*',
+ element: ,
+};
+
+export default function Router() {
+ const permissionRoutes = usePermissionRoutes();
+ const asyncRoutes: AppRouteObject = {
+ path: '/',
+ element: (
+
+
+
+ ),
+ children: [
+ { index: true, element: },
+ ...permissionRoutes,
+ ],
+ };
+
+ const routes = [LoginRoute, asyncRoutes, ErrorRoutes, PAGE_NOT_FOUND_ROUTE];
+
+ // const router = createHashRouter(routes as unknown as RouteObject[]);
+ const router = createBrowserRouter(routes as unknown as RouteObject[], {
+ basename: '/ads',
+ });
+
+ return ;
+}
diff --git a/src/router/routes/error-routes.tsx b/src/router/routes/error-routes.tsx
new file mode 100644
index 0000000..3a0cdfd
--- /dev/null
+++ b/src/router/routes/error-routes.tsx
@@ -0,0 +1,34 @@
+import { Suspense, lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import { CircleLoading } from '@/components/loading';
+import SimpleLayout from '@/layouts/simple';
+
+import AuthGuard from '../components/auth-guard';
+
+import { AppRouteObject } from '#/router';
+
+const Page403 = lazy(() => import('@/pages/sys/error/Page403'));
+const Page404 = lazy(() => import('@/pages/sys/error/Page404'));
+const Page500 = lazy(() => import('@/pages/sys/error/Page500'));
+
+/**
+ * error routes
+ * 403, 404, 500
+ */
+export const ErrorRoutes: AppRouteObject = {
+ element: (
+
+
+ }>
+
+
+
+
+ ),
+ children: [
+ { path: '403', element: },
+ { path: '404', element: },
+ { path: '500', element: },
+ ],
+};
diff --git a/src/router/routes/menu-routes.tsx b/src/router/routes/menu-routes.tsx
new file mode 100644
index 0000000..7a2378c
--- /dev/null
+++ b/src/router/routes/menu-routes.tsx
@@ -0,0 +1,24 @@
+import { Navigate } from 'react-router-dom';
+
+import DashboardLayout from '@/layouts/dashboard';
+import { APP_HOMEPAGE } from '@/utils/contant';
+
+import AuthGuard from '../components/auth-guard';
+import { getRoutesFromModules } from '../utils';
+
+import { AppRouteObject } from '#/router';
+
+const menuModuleRoutes = getRoutesFromModules();
+
+/**
+ * dynamic routes
+ */
+export const menuRoutes: AppRouteObject = {
+ path: '/',
+ element: (
+
+
+
+ ),
+ children: [{ index: true, element: }, ...menuModuleRoutes],
+};
diff --git a/src/router/routes/modules/errors.tsx b/src/router/routes/modules/errors.tsx
new file mode 100644
index 0000000..0aa9ea2
--- /dev/null
+++ b/src/router/routes/modules/errors.tsx
@@ -0,0 +1,56 @@
+import { Suspense, lazy } from 'react';
+import { Outlet } from 'react-router-dom';
+
+import { Iconify } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const Page403 = lazy(() => import('@/pages/sys/error/Page403'));
+const Page404 = lazy(() => import('@/pages/sys/error/Page404'));
+const Page500 = lazy(() => import('@/pages/sys/error/Page500'));
+
+const errors: AppRouteObject[] = [
+ {
+ path: 'error',
+ order: 6,
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.error.index',
+ icon: ,
+ key: '/error',
+ },
+ children: [
+ {
+ path: '403',
+ element: ,
+ meta: {
+ label: 'sys.menu.error.403',
+ key: '/error/403',
+ },
+ },
+ {
+ path: '404',
+ element: ,
+ meta: {
+ label: 'sys.menu.error.404',
+ key: '/error/404',
+ },
+ },
+ {
+ path: '500',
+ element: ,
+ meta: {
+ label: 'sys.menu.error.500',
+ key: '/error/500',
+ },
+ },
+ ],
+ },
+];
+
+export default errors;
diff --git a/src/router/routes/modules/others.tsx b/src/router/routes/modules/others.tsx
new file mode 100644
index 0000000..ab552f3
--- /dev/null
+++ b/src/router/routes/modules/others.tsx
@@ -0,0 +1,43 @@
+import { Suspense, lazy } from 'react';
+
+import { Iconify } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const TextAdvertising = lazy(() => import('@/pages/text-advertising'));
+const BannerAdvertising = lazy(() => import('@/pages/banner-advertising'));
+
+function Wrapper({ children }: any) {
+ return }>{children};
+}
+const others: AppRouteObject[] = [
+ {
+ path: 'text-advertising',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.text_advertising',
+ icon: ,
+ key: '/text-advertising',
+ },
+ },
+ {
+ path: 'banner-advertising',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.banner_advertising',
+ icon: ,
+ key: '/banner-advertising',
+ },
+ },
+];
+
+export default others;
diff --git a/src/router/utils.ts b/src/router/utils.ts
new file mode 100644
index 0000000..5182eb2
--- /dev/null
+++ b/src/router/utils.ts
@@ -0,0 +1,53 @@
+import { ascend } from 'ramda';
+
+import { AppRouteObject, RouteMeta } from '#/router';
+
+/**
+ * return menu routes
+ */
+export const menuFilter = (items: AppRouteObject[]) => {
+ return items
+ .filter((item) => {
+ const show = item.meta?.key;
+ if (show && item.children) {
+ item.children = menuFilter(item.children);
+ }
+ return show;
+ })
+ .sort(ascend((item) => item.order || Infinity));
+};
+
+/**
+ * src/router/routes/modules
+ */
+export function getRoutesFromModules() {
+ const menuModules: AppRouteObject[] = [];
+
+ const modules = import.meta.glob('./routes/modules/**/*.tsx', { eager: true });
+ Object.keys(modules).forEach((key) => {
+ const mod = (modules as any)[key].default || {};
+ const modList = Array.isArray(mod) ? [...mod] : [mod];
+ menuModules.push(...modList);
+ });
+ return menuModules;
+}
+
+/**
+ * return the routes will be used in sidebar menu
+ */
+export function getMenuRoutes(appRouteObjects: AppRouteObject[]) {
+ // return menuFilter(getMenuModules());
+ return menuFilter(appRouteObjects);
+}
+
+/**
+ * return flatten routes
+ */
+export function flattenMenuRoutes(routes: AppRouteObject[]) {
+ return routes.reduce((prev, item) => {
+ const { meta, children } = item;
+ if (meta) prev.push(meta);
+ if (children) prev.push(...flattenMenuRoutes(children));
+ return prev;
+ }, []);
+}
diff --git a/src/store/settingStore.ts b/src/store/settingStore.ts
new file mode 100644
index 0000000..2d55704
--- /dev/null
+++ b/src/store/settingStore.ts
@@ -0,0 +1,44 @@
+import { create } from 'zustand';
+
+import { getItem, removeItem, setItem } from '@/utils/storage';
+
+import { StorageEnum, ThemeColorPresets, ThemeLayout, ThemeMode } from '#/enum';
+
+type SettingsType = {
+ themeColorPresets: ThemeColorPresets;
+ themeMode: ThemeMode;
+ themeLayout: ThemeLayout;
+ themeStretch: boolean;
+ breadCrumb: boolean;
+ multiTab: boolean;
+};
+type SettingStore = {
+ settings: SettingsType;
+ actions: {
+ setSettings: (settings: SettingsType) => void;
+ clearSettings: () => void;
+ };
+};
+
+const useSettingStore = create((set) => ({
+ settings: getItem(StorageEnum.Settings) || {
+ themeColorPresets: ThemeColorPresets.Default,
+ themeMode: ThemeMode.Light,
+ themeLayout: ThemeLayout.Vertical,
+ themeStretch: false,
+ breadCrumb: true,
+ multiTab: true,
+ },
+ actions: {
+ setSettings: (settings) => {
+ set({ settings });
+ setItem(StorageEnum.Settings, settings);
+ },
+ clearSettings() {
+ removeItem(StorageEnum.Settings);
+ },
+ },
+}));
+
+export const useSettings = () => useSettingStore((state) => state.settings);
+export const useSettingActions = () => useSettingStore((state) => state.actions);
diff --git a/src/store/userStore.ts b/src/store/userStore.ts
new file mode 100644
index 0000000..d9aadb5
--- /dev/null
+++ b/src/store/userStore.ts
@@ -0,0 +1,81 @@
+import { useMutation } from '@tanstack/react-query';
+import { App } from 'antd';
+import { useNavigate } from 'react-router-dom';
+import { create } from 'zustand';
+
+import { ADMIN_ROLE } from '@/_mock/assets';
+import userService, { SignInReq } from '@/api/services/userService';
+import { APP_HOMEPAGE } from '@/utils/contant';
+import { getItem, removeItem, setItem } from '@/utils/storage';
+
+import { UserInfo, UserToken } from '#/entity';
+import { StorageEnum } from '#/enum';
+
+type UserStore = {
+ userInfo: Partial;
+ userToken: UserToken;
+ actions: {
+ setUserInfo: (userInfo: UserInfo) => void;
+ setUserToken: (token: UserToken) => void;
+ clearUserInfoAndToken: () => void;
+ };
+};
+
+const useUserStore = create((set) => ({
+ userInfo: getItem(StorageEnum.User) || {},
+ userToken: getItem(StorageEnum.Token) || {},
+ actions: {
+ setUserInfo: (userInfo) => {
+ set({ userInfo });
+ setItem(StorageEnum.User, userInfo);
+ },
+ setUserToken: (userToken) => {
+ set({ userToken });
+ setItem(StorageEnum.Token, userToken);
+ },
+ clearUserInfoAndToken() {
+ set({ userInfo: {}, userToken: {} });
+ removeItem(StorageEnum.User);
+ removeItem(StorageEnum.Token);
+ },
+ },
+}));
+
+export const useUserInfo = () => useUserStore((state) => state.userInfo);
+export const useUserToken = () => useUserStore((state) => state.userToken);
+export const useUserPermission = () => useUserStore((state) => state.userInfo.permissions);
+export const useUserActions = () => useUserStore((state) => state.actions);
+
+export const useSignIn = () => {
+ const navigatge = useNavigate();
+ const { message } = App.useApp();
+ const { setUserToken, setUserInfo } = useUserActions();
+
+ const signInMutation = useMutation({
+ mutationFn: userService.signin,
+ });
+
+ const signIn = async (data: SignInReq) => {
+ try {
+ const res = await signInMutation.mutateAsync(data);
+ const { access_token: accessToken, token_type: tokenType } = res;
+ setUserToken({ access_token: accessToken, token_type: tokenType });
+ setUserInfo({
+ id: 'b34719e1-ce46-457e-9575-99505ecee828',
+ email: '',
+ username: data.username,
+ permissions: ADMIN_ROLE.permission,
+ });
+ navigatge(APP_HOMEPAGE, { replace: true });
+ } catch (err) {
+ message.warning({
+ content: err.message,
+ duration: 3,
+ });
+ }
+ };
+
+ return signIn;
+};
+
+export default useUserStore;
diff --git a/src/theme/antd/components/rage.tsx b/src/theme/antd/components/rage.tsx
new file mode 100644
index 0000000..4317aca
--- /dev/null
+++ b/src/theme/antd/components/rage.tsx
@@ -0,0 +1,21 @@
+import { Rate, RateProps } from 'antd';
+import styled from 'styled-components';
+
+import { Iconify } from '@/components/icon';
+
+export default function ProRate(props: RateProps) {
+ return (
+
+ } {...props} />
+
+ );
+}
+
+const StyledRate = styled.div`
+ .ant-rate {
+ color: rgb(250, 175, 0);
+ .ant-rate-star:not(:last-child) {
+ margin-inline-end: 0;
+ }
+ }
+`;
diff --git a/src/theme/antd/components/tag.tsx b/src/theme/antd/components/tag.tsx
new file mode 100644
index 0000000..434efaf
--- /dev/null
+++ b/src/theme/antd/components/tag.tsx
@@ -0,0 +1,31 @@
+import { Tag, TagProps } from 'antd';
+import styled from 'styled-components';
+
+export default function ProTag(props: TagProps) {
+ return (
+
+
+
+ );
+}
+
+const StyledTag = styled.div`
+ display: inline-flex;
+ .ant-tag {
+ border-radius: 6px;
+ cursor: default;
+ height: 24px;
+ min-width: 24px;
+ padding: 0 6px;
+ margin: 0 6px;
+ font-size: 0.75rem;
+ font-weight: 700;
+ border-width: 0;
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ white-space: nowrap;
+ text-transform: capitalize;
+ transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
+ }
+`;
diff --git a/src/theme/antd/index.tsx b/src/theme/antd/index.tsx
new file mode 100644
index 0000000..9cf5ae5
--- /dev/null
+++ b/src/theme/antd/index.tsx
@@ -0,0 +1,41 @@
+import { StyleProvider } from '@ant-design/cssinjs';
+import { ConfigProvider, theme } from 'antd';
+import 'antd/dist/reset.css';
+
+import useLocale from '@/locales/useLocale';
+import { useSettings } from '@/store/settingStore';
+
+import {
+ customThemeTokenConfig,
+ themeModeToken,
+ colorPrimarys,
+ customComponentConfig,
+} from './theme';
+
+import { ThemeMode } from '#/enum';
+
+type Props = {
+ children: React.ReactNode;
+};
+export default function AntdConfig({ children }: Props) {
+ const { themeMode, themeColorPresets } = useSettings();
+
+ const { language } = useLocale();
+
+ const algorithm = themeMode === ThemeMode.Light ? theme.defaultAlgorithm : theme.darkAlgorithm;
+ const colorPrimary = colorPrimarys[themeColorPresets];
+
+ return (
+
+ {/* https://ant.design/docs/react/compatible-style-cn#styleprovider */}
+ {children}
+
+ );
+}
diff --git a/src/theme/antd/theme.ts b/src/theme/antd/theme.ts
new file mode 100644
index 0000000..42fbdf3
--- /dev/null
+++ b/src/theme/antd/theme.ts
@@ -0,0 +1,64 @@
+import { ThemeConfig } from 'antd';
+
+import { ThemeColorPresets } from '#/enum';
+/**
+ * Antd theme editor: https://ant.design/theme-editor-cn
+ */
+const customThemeTokenConfig: ThemeConfig['token'] = {
+ colorSuccess: '#22c55e',
+ colorWarning: '#ff7849',
+ colorError: '#ff5630',
+ colorInfo: '#00b8d9',
+
+ wireframe: false,
+
+ borderRadiusSM: 2,
+ borderRadius: 4,
+ borderRadiusLG: 8,
+};
+
+const customComponentConfig: ThemeConfig['components'] = {
+ Breadcrumb: {
+ fontSize: 12,
+ separatorMargin: 4,
+ },
+ Menu: {
+ fontSize: 14,
+ colorFillAlter: 'transparent',
+ itemColor: 'rgb(145, 158, 171)',
+ motionDurationMid: '0.125s',
+ motionDurationSlow: '0.125s',
+ },
+};
+
+const colorPrimarys: {
+ [k in ThemeColorPresets]: string;
+} = {
+ default: '#00a76f',
+ cyan: '#078DEE',
+ purple: '#7635DC',
+ blue: '#2065D1',
+ orange: '#FDA92D',
+ red: '#FF3030',
+};
+
+const themeModeToken: Record<'dark' | 'light', ThemeConfig> = {
+ dark: {
+ token: {
+ colorBgLayout: '#161c24',
+ colorBgContainer: '#212b36',
+ colorBgElevated: '#161c24',
+ },
+ components: {
+ Modal: {
+ headerBg: '#212b36',
+ contentBg: '#212b36',
+ footerBg: '#212b36',
+ },
+ Notification: {},
+ },
+ },
+ light: {},
+};
+
+export { customThemeTokenConfig, customComponentConfig, colorPrimarys, themeModeToken };
diff --git a/src/theme/base.css b/src/theme/base.css
new file mode 100644
index 0000000..15f398c
--- /dev/null
+++ b/src/theme/base.css
@@ -0,0 +1,365 @@
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box; /* 1 */
+ border-style: solid; /* 2 */
+ border-width: 0; /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+*/
+
+html {
+ line-height: 1.5; /* 1 */ /* 3 */
+ tab-size: 4; /* 3 */
+ text-size-adjust: 100%; /* 2 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0; /* 1 */
+ line-height: inherit; /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0; /* 1 */
+ color: inherit; /* 2 */
+ border-top-width: 1px; /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-weight: inherit;
+ font-size: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-size: 1em; /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0; /* 1 */
+ border-color: inherit; /* 2 */
+ border-collapse: collapse; /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0; /* 2 */
+ padding: 0; /* 3 */
+ color: inherit; /* 1 */
+ font-weight: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ font-family: inherit; /* 1 */
+ line-height: inherit; /* 1 */
+ font-feature-settings: inherit; /* 1 */
+ font-variation-settings: inherit; /* 1 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button {
+ background-color: inherit;
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ outline-offset: -2px; /* 2 */
+ appearance: textfield; /* 1 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ font: inherit; /* 2 */
+ appearance: button; /* 1 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+/*
+Reset default styling for dialogs.
+*/
+dialog {
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1; /* 1 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block; /* 1 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+[hidden] {
+ display: none;
+}
diff --git a/src/theme/global.css b/src/theme/global.css
new file mode 100644
index 0000000..212d887
--- /dev/null
+++ b/src/theme/global.css
@@ -0,0 +1,9 @@
+/* editor */
+@import 'react-quill/dist/quill.snow.css';
+
+/* simplebar */
+@import 'simplebar-react/dist/simplebar.min.css';
+@import 'tailwindcss/base';
+@import 'tailwindcss/components';
+@import 'tailwindcss/utilities';
+
diff --git a/src/theme/hooks/index.ts b/src/theme/hooks/index.ts
new file mode 100644
index 0000000..107354b
--- /dev/null
+++ b/src/theme/hooks/index.ts
@@ -0,0 +1,2 @@
+export { useThemeToken } from './use-theme-token';
+export { useResponsive } from './use-reponsive';
diff --git a/src/theme/hooks/use-reponsive.ts b/src/theme/hooks/use-reponsive.ts
new file mode 100644
index 0000000..99a879d
--- /dev/null
+++ b/src/theme/hooks/use-reponsive.ts
@@ -0,0 +1,31 @@
+import { Grid, theme } from 'antd';
+import { Breakpoint, ScreenMap, ScreenSizeMap } from 'antd/es/_util/responsiveObserver';
+
+const { useBreakpoint } = Grid;
+
+export function useResponsive() {
+ const {
+ token: { screenXS, screenSM, screenMD, screenLG, screenXL, screenXXL },
+ } = theme.useToken();
+ const screenArray: Breakpoint[] = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];
+
+ const screenEnum: ScreenSizeMap = {
+ xs: screenXS,
+ sm: screenSM,
+ md: screenMD,
+ lg: screenLG,
+ xl: screenXL,
+ xxl: screenXXL,
+ };
+ const screenMap: ScreenMap = useBreakpoint();
+
+ const currentScrren = [...screenArray].reverse().find((item) => {
+ const result = screenMap[item];
+ return result === true;
+ });
+ return {
+ screenEnum,
+ screenMap,
+ currentScrren,
+ };
+}
diff --git a/src/theme/hooks/use-theme-token.ts b/src/theme/hooks/use-theme-token.ts
new file mode 100644
index 0000000..52ac742
--- /dev/null
+++ b/src/theme/hooks/use-theme-token.ts
@@ -0,0 +1,7 @@
+import { theme } from 'antd';
+import { useMemo } from 'react';
+
+export function useThemeToken() {
+ const { token } = theme.useToken();
+ return useMemo(() => token, [token]);
+}
diff --git a/src/theme/index.css b/src/theme/index.css
new file mode 100644
index 0000000..97af56a
--- /dev/null
+++ b/src/theme/index.css
@@ -0,0 +1,3 @@
+
+@import './base.css';
+@import './global.css';
diff --git a/src/utils/contant.ts b/src/utils/contant.ts
new file mode 100644
index 0000000..88d856d
--- /dev/null
+++ b/src/utils/contant.ts
@@ -0,0 +1,24 @@
+export const advertisingLabels = [
+ 'homeSearch',
+ 'otherSearch',
+ 'Addressdetail',
+ 'Contractdetail',
+ 'topaccount',
+ 'blockdetail',
+ 'blocks',
+ 'chart',
+ 'chartdetail',
+ 'contracts',
+ 'nfts',
+ 'tokens',
+ 'tokendetail',
+ 'transactions',
+ 'txndetail',
+];
+
+export const advertisingCounts = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+
+export const BannerAdvertisingLabels = ['home', 'txndetail', 'Addressdetail'];
+
+export const APP_BASE_API = '/api/app';
+export const APP_HOMEPAGE = '/text-advertising';
diff --git a/src/utils/format-number.ts b/src/utils/format-number.ts
new file mode 100644
index 0000000..0212fbe
--- /dev/null
+++ b/src/utils/format-number.ts
@@ -0,0 +1,38 @@
+// https://numeraljs.com/
+import numeral from 'numeral';
+
+type InputValue = string | number | null | undefined;
+
+export function fNumber(number: InputValue) {
+ return numeral(number).format();
+}
+
+export function fCurrency(number: InputValue) {
+ const format = number ? numeral(number).format('$0,0.00') : '';
+
+ return result(format, '.00');
+}
+
+export function fPercent(number: InputValue) {
+ const format = number ? numeral(Number(number) / 100).format('0.0%') : '';
+
+ return result(format, '.0');
+}
+
+export function fShortenNumber(number: InputValue) {
+ const format = number ? numeral(number).format('0.00a') : '';
+
+ return result(format, '.00');
+}
+
+export function fBytes(number: InputValue) {
+ const format = number ? numeral(number).format('0.0 b') : '';
+
+ return result(format, '.0');
+}
+
+function result(format: string, key = '.00') {
+ const isInteger = format.includes(key);
+
+ return isInteger ? format.replace(key, '') : format;
+}
diff --git a/src/utils/highlight.ts b/src/utils/highlight.ts
new file mode 100644
index 0000000..59f9324
--- /dev/null
+++ b/src/utils/highlight.ts
@@ -0,0 +1,19 @@
+import 'highlight.js/styles/base16/tomorrow-night.css';
+
+import hljs from 'highlight.js';
+
+// ----------------------------------------------------------------------
+
+declare global {
+ interface Window {
+ hljs: any;
+ }
+}
+
+hljs.configure({
+ languages: ['javascript', 'sh', 'bash', 'html', 'scss', 'css', 'json'],
+});
+
+if (typeof window !== 'undefined') {
+ window.hljs = hljs;
+}
diff --git a/src/utils/storage.ts b/src/utils/storage.ts
new file mode 100644
index 0000000..507ec96
--- /dev/null
+++ b/src/utils/storage.ts
@@ -0,0 +1,28 @@
+import { StorageEnum } from '#/enum';
+
+export const getItem = (key: StorageEnum): T | null => {
+ let value = null;
+ try {
+ const result = window.localStorage.getItem(key);
+ if (result) {
+ value = JSON.parse(result);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ return value;
+};
+
+export const getStringItem = (key: StorageEnum): string | null => {
+ return localStorage.getItem(key);
+};
+
+export const setItem = (key: StorageEnum, value: T): void => {
+ localStorage.setItem(key, JSON.stringify(value));
+};
+export const removeItem = (key: StorageEnum): void => {
+ localStorage.removeItem(key);
+};
+export const clearItems = () => {
+ localStorage.clear();
+};
diff --git a/src/utils/tree.ts b/src/utils/tree.ts
new file mode 100644
index 0000000..a6b4ed4
--- /dev/null
+++ b/src/utils/tree.ts
@@ -0,0 +1,13 @@
+import { chain } from 'ramda';
+
+/**
+ * Flatten an array containing a tree structure
+ * @param {T[]} trees - An array containing a tree structure
+ * @returns {T[]} - Flattened array
+ */
+export function flattenTrees(trees: T[] = []): T[] {
+ return chain((node) => {
+ const children = node.children || [];
+ return [node, ...flattenTrees(children)];
+ }, trees);
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..853d9f8
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,56 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ darkMode: 'class',
+ content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ screens: {
+ xs: '480px',
+ sm: '576px',
+ md: '768px',
+ lg: '992px',
+ xl: '1200px',
+ '2xl': '1600px',
+ },
+ colors: {
+ black: '#000000',
+ green: '#00A76F',
+ blue: '#1fb6ff',
+ purple: '#7e5bef',
+ pink: '#ff49db',
+ orange: '#ff7849',
+ yellow: '#ffc82c',
+ gray: '#637381',
+ hover: '#63738114',
+
+ success: '#22c55e',
+ warning: '#ff7849',
+ error: '#ff5630',
+ info: '#00b8d9',
+
+ code: '#d63384',
+
+ 'gray-100': '#F9FAFB',
+ 'gray-200': '#F4F6F8',
+ 'gray-300': '#DFE3E8',
+ 'gray-400': '#C4CDD5',
+ 'gray-500': '#F9FAFB',
+ 'gray-600': '#637381',
+ 'gray-700': '#454F5B',
+ 'gray-800': '#212B36',
+ 'gray-900': '#161C24',
+ },
+ extend: {
+ transitionProperty: {
+ height: 'height',
+ },
+ animation: {
+ 'spin-slow': 'spin 8s linear infinite',
+ },
+ },
+ },
+ corePlugins: {
+ // Remove the Tailwind CSS preflight styles so it can use custom base style (src/theme/base.css)
+ preflight: false, // https://tailwindcss.com/docs/preflight#disabling-preflight
+ },
+ plugins: [],
+};
diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json
new file mode 100644
index 0000000..6ca9ee2
--- /dev/null
+++ b/tsconfig.eslint.json
@@ -0,0 +1,6 @@
+{
+ // extend your base config so you don't have to redefine your compilerOptions
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*", "types", "vite.config.ts", "vite-env.d.ts", "**/*.*js"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..6dd9dfd
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,45 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "module": "ESNext",
+ "lib": ["ESNext", "DOM", "DOM.Iterable"],
+ "useDefineForClassFields": true,
+ "skipLibCheck": true,
+ "allowJs": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "sourceMap": true,
+ "declaration": true,
+ "preserveWatchOutput": true,
+ "removeComments": true,
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ "esModuleInterop": true,
+
+ /* Linting */
+ "strict": true,
+ "strictNullChecks": true,
+ "noImplicitAny": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "useUnknownInCatchVariables": false,
+
+ // https://vitejs.dev/guide/features#client-types
+ "types": ["vite/client"],
+
+ "baseUrl": ".",
+ /* alias */
+ "paths": {
+ "@/*": ["src/*"],
+ "#/*": ["types/*"]
+ }
+ },
+ "include": ["src", "types"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/types/api.ts b/types/api.ts
new file mode 100644
index 0000000..b80d53e
--- /dev/null
+++ b/types/api.ts
@@ -0,0 +1,7 @@
+export interface Result {
+ access_token?: string;
+ status: number;
+ message: string;
+ code: string;
+ data?: T;
+}
diff --git a/types/entity.ts b/types/entity.ts
new file mode 100644
index 0000000..5ea3401
--- /dev/null
+++ b/types/entity.ts
@@ -0,0 +1,61 @@
+import { TablePaginationConfig } from 'antd';
+
+import { BasicStatus, PermissionType } from './enum';
+
+export interface UserToken {
+ access_token?: string;
+ token_type?: string;
+ expires_in?: string;
+}
+
+export interface UserInfo {
+ id: string;
+ email: string;
+ username: string;
+ password?: string;
+ avatar?: string;
+ role?: Role;
+ status?: BasicStatus;
+ permissions?: Permission[];
+}
+
+export interface Organization {
+ id: string;
+ name: string;
+ status: 'enable' | 'disable';
+ desc?: string;
+ order?: number;
+ children?: Organization[];
+}
+
+export interface Permission {
+ id: string;
+ parentId: string;
+ name: string;
+ label: string;
+ type: PermissionType;
+ route: string;
+ status?: BasicStatus;
+ order?: number;
+ icon?: string;
+ component?: string;
+ hide?: boolean;
+ hideTab?: boolean;
+ frameSrc?: string;
+ newFeature?: boolean;
+ children?: Permission[];
+}
+
+export interface Role {
+ id: string;
+ name: string;
+ label: string;
+ status: BasicStatus;
+ order?: number;
+ desc?: string;
+ permission?: Permission[];
+}
+
+export interface TableParams {
+ pagination?: TablePaginationConfig;
+}
diff --git a/types/enum.ts b/types/enum.ts
new file mode 100644
index 0000000..7c1af18
--- /dev/null
+++ b/types/enum.ts
@@ -0,0 +1,57 @@
+export enum BasicStatus {
+ DISABLE,
+ ENABLE,
+}
+
+export enum ResultEnum {
+ SUCCESS = 0,
+ ERROR = -1,
+ TIMEOUT = 401,
+}
+
+export enum StorageEnum {
+ User = 'user',
+ Token = 'token',
+ Settings = 'settings',
+ I18N = 'i18nextLng',
+}
+
+export enum ThemeMode {
+ Light = 'light',
+ Dark = 'dark',
+}
+
+export enum ThemeLayout {
+ Vertical = 'vertical',
+ Horizontal = 'horizontal',
+ Mini = 'mini',
+}
+
+export enum ThemeColorPresets {
+ Default = 'default',
+ Cyan = 'cyan',
+ Purple = 'purple',
+ Blue = 'blue',
+ Orange = 'orange',
+ Red = 'red',
+}
+
+export enum LocalEnum {
+ en_US = 'en_US',
+}
+
+export enum MultiTabOperation {
+ FULLSCREEN = 'fullscreen',
+ REFRESH = 'refresh',
+ CLOSE = 'close',
+ CLOSEOTHERS = 'closeOthers',
+ CLOSEALL = 'closeAll',
+ CLOSELEFT = 'closeLeft',
+ CLOSERIGHT = 'closeRight',
+}
+
+export enum PermissionType {
+ CATALOGUE,
+ MENU,
+ BUTTON,
+}
diff --git a/types/router.ts b/types/router.ts
new file mode 100644
index 0000000..4f41f6e
--- /dev/null
+++ b/types/router.ts
@@ -0,0 +1,56 @@
+import { ReactNode } from 'react';
+import { Params, RouteObject } from 'react-router-dom';
+
+export interface RouteMeta {
+ /**
+ * antd menu selectedKeys
+ */
+ key: string;
+ /**
+ * menu label, i18n
+ */
+ label: string;
+ /**
+ * menu prefix icon
+ */
+ icon?: ReactNode;
+ /**
+ * menu suffix icon
+ */
+ suffix?: ReactNode;
+ /**
+ * hide in menu
+ */
+ hideMenu?: boolean;
+ /**
+ * hide in multi tab
+ */
+ hideTab?: boolean;
+ /**
+ * disable in menu
+ */
+ disabled?: boolean;
+ /**
+ * react router outlet
+ */
+ outlet?: any;
+ /**
+ * use to refresh tab
+ */
+ timeStamp?: string;
+ /**
+ * external link and iframe need
+ */
+ frameSrc?: string;
+ /**
+ * dynamic route params
+ *
+ * @example /user/:id
+ */
+ params?: Params;
+}
+export type AppRouteObject = {
+ order?: number;
+ meta?: RouteMeta;
+ children?: AppRouteObject[];
+} & Omit;
diff --git a/vite-env.d.ts b/vite-env.d.ts
new file mode 100644
index 0000000..5f0742d
--- /dev/null
+++ b/vite-env.d.ts
@@ -0,0 +1,12 @@
+///
+
+interface ImportMetaEnv {
+ readonly VITE_GLOB_APP_TITLE: string;
+ readonly VITE_APP_BASE_API: string;
+ readonly VITE_APP_HOMEPAGE: string;
+ readonly VITE_APP_ENV: 'development' | 'production';
+}
+
+interface ImportMeta {
+ readonly env: ImportMetaEnv;
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..2a1de7d
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,58 @@
+import path from 'path';
+
+import react from '@vitejs/plugin-react';
+import { defineConfig } from 'vite';
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
+import tsconfigPaths from 'vite-tsconfig-paths';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ base: '/ads/',
+ esbuild: {
+ // drop: ['console', 'debugger'],
+ },
+ css: {
+ devSourcemap: true,
+ },
+ plugins: [
+ react(),
+
+ tsconfigPaths(),
+ createSvgIconsPlugin({
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
+ symbolId: 'icon-[dir]-[name]',
+ }),
+ ],
+ server: {
+ open: true,
+ host: true,
+ port: 3001,
+ proxy: {
+ '/api/app': {
+ target: 'https://testnet.aelfscan.io',
+ changeOrigin: true,
+ // rewrite: (path) => path.replace(/^\/api/, ''),
+ },
+ '/connect/token': {
+ target: 'https://testnet.aelfscan.io',
+ changeOrigin: true,
+ // rewrite: (path) => path.replace(/^\/api/, ''),
+ },
+ // '/api': {
+ // target: 'http://localhost:3000',
+ // changeOrigin: true,
+ // rewrite: (path) => path.replace(/^\/api/, ''),
+ // },
+ },
+ },
+ build: {
+ target: 'esnext',
+ minify: 'terser',
+ terserOptions: {
+ compress: {
+ drop_console: true,
+ drop_debugger: true,
+ },
+ },
+ },
+});