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/.env b/.env
new file mode 100644
index 0000000..19c1d9f
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+VITE_GLOB_APP_TITLE = Vite React TS Template
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..37f0871
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,2 @@
+VITE_APP_BASE_API=/api
+VITE_APP_HOMEPAGE=/dashboard/workbench
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..37f0871
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,2 @@
+VITE_APP_BASE_API=/api
+VITE_APP_HOMEPAGE=/dashboard/workbench
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..8647ad9
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,22 @@
+*.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
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..d5ef074
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,144 @@
+module.exports = {
+ root: true, // 表示当前目录即为根目录,ESLint 规则将被限制到该目录下
+ env: { browser: true, es2020: true, node: true },
+ /* 解析器 */
+ parser: '@typescript-eslint/parser', // 指定ESLint解析器
+ parserOptions: {
+ project: './tsconfig.json', // tsconfig.json的路径
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ ecmaFeatures: {
+ jsx: true, // 启用JSX
+ },
+ extraFileExtensions: ['.json'],
+ },
+ settings: {
+ // 识别 @ # alias
+ 'import/resolver': {
+ alias: {
+ map: [
+ ['@', './src'],
+ ['#', './types'],
+ ],
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
+ },
+ },
+ },
+ /* ESLint 中基础配置需要继承的配置 */
+ extends: [
+ 'airbnb',
+ 'airbnb-typescript',
+ 'airbnb/hooks',
+ 'plugin:@typescript-eslint/recommended', // 使用@typescript-eslint/eslint-plugin推荐的规则
+ 'plugin:jsx-a11y/recommended',
+ 'plugin:import/errors',
+ 'plugin:import/warnings',
+ 'prettier', // 增加 prettier 相关的校验规则
+ 'plugin:prettier/recommended', // 开启 Prettier 插件推荐的规则
+ ],
+ /* ESLint文件所依赖的插件 */
+ plugins: [
+ '@typescript-eslint',
+ 'prettier',
+ 'react',
+ 'react-hooks',
+ 'jsx-a11y',
+ 'import',
+ 'unused-imports',
+ ],
+ /**
+ * 定义规则
+ * "off" 或 0 - 关闭规则
+ * "warn" 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
+ * "error" 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
+ */
+ rules: {
+ '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/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/order': [
+ 'warn',
+ {
+ groups: [
+ 'builtin', // Node.js内置模块
+ '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/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..b9ed669
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,46 @@
+name: CI
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ build-and-deploy:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [16.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+
+ steps:
+ - name: Checkout 🛎️
+ uses: actions/checkout@v3
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 8
+
+ - name: Setup Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'pnpm'
+
+ - name: Install and Build 🔧
+ run: |
+ pnpm install
+ pnpm build
+
+ - name: Deploy 🚀
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ TOKEN: ${{ secrets.ACCESS_TOKEN }}
+ FOLDER: dist
+ CLEAN: true
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..178e6c3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,25 @@
+# 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?
+
+# vite 打包分析产物
+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..00f5ab7
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,22 @@
+# Stage 1: build stage
+FROM node:16-alpine as build-stage
+# make the 'app' folder the current working directory
+WORKDIR /app
+# copy project files and folders to the current working directory (i.e. 'app' folder)
+COPY . ./
+# config node options
+ENV NODE_OPTIONS=--max_old_space_size=8192
+# config pnpm, install dependencies and build
+RUN npm install pnpm -g && \
+ pnpm install && \
+ 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
+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/README.md b/README.md
new file mode 100644
index 0000000..e28ca5e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,116 @@
+
+
+
+
Slash Admin
+
+
+
+**English** | [中文](./README.zh-CN.md)
+
+## Introduction
+Slash Admin is a modern admin dashboard template built with React 18, Vite, Ant Design, and TypeScript. It is designed to help developers quickly create powerful admin management systems.
+
+## Preview
++ https://admin.slashspaces.com/
+
+![login.png](https://d3george.github.io/github-static/slash-admin/login.jpeg)
+![login_dark.png](https://d3george.github.io/github-static/slash-admin/login_dark.jpeg)
+![analysis.png](https://d3george.github.io/github-static/slash-admin/analysis.png)
+![workbench.png](https://d3george.github.io/github-static/slash-admin/workbench.png)
+
+## Features
+
+- Built using React 18 hooks.
+- Powered by Vite for rapid development and hot module replacement.
+- Integrates Ant Design, providing a rich set of UI components and design patterns.
+- Written in TypeScript, offering type safety and an improved development experience.
+- Responsive design, adapting to various screen sizes and devices.
+- Flexible routing configuration, supporting nested routes.
+- Integrated access control based on user roles.
+- Supports internationalization for easy language switching.
+- Includes common admin features like user management, role management, and permission management.
+- Customizable themes and styles to meet your branding needs.
+- Mocking solution based on MSW and Faker.js.
+- State management using Zustand.
+- Data fetching using React-Query.
+
+## Quick Start
+
+### Get the Project Code
+
+```bash
+git clone https://github.com/d3george/slash-admin.git
+```
+
+### Install Dependencies
+
+In the project's root directory, run the following command to install project dependencies:
+
+```bash
+pnpm install
+```
+
+### Start the Development Server
+
+Run the following command to start the development server:
+
+```bash
+pnpm dev
+```
+
+Visit [http://localhost:3001](http://localhost:3001) to view your application.
+
+### Build for Production
+
+Run the following command to build the production version:
+
+```bash
+pnpm build
+```
+
+## Docker deployment
+
+
+### Build image and Run container
+#### build image
+Enter the project root directory in the terminal and execute the following command to build the Docker image:
+```
+docker build -t your-image-name .
+```
+Make sure to replace `your-image-name` with your own image name
+
+#### run container
+Run your application in the Docker container using the following command:
+```
+docker run -p 3001:80 your-image-name
+```
+This will run your application on port `80`(exposed in `Dockerfile`) of the container and map it to port `3001` on your host.
+
+Now you can access http://localhost:3001 to view the deployed applications.
+
+### use docker-compose.yaml
+Enter the project root directory in the terminal and execute the following command to start Docker Compose:
+```
+docker-compose up -d
+```
+Docker Compose will build an image based on the configuration defined by 'docker-compose. yaml' and run the container in the background.
+
+After the container runs successfully, it can also be accessed through http://localhost:3001 To view the deployed applications.
+
+
+## Git Contribution submission specification
+
+reference[.commitlint.config.js](./commitlint.config.js)
+
+- `feat` new features
+- `fix` fix the
+- `docs` documentation or comments
+- `style` code format (changes that do not affect code execution)
+- `refactor` refactor
+- `perf` performance optimization
+- `revert` revert commit
+- `test` test related
+- `chore` changes in the construction process or auxiliary tools
+- `ci` modify CI configuration and scripts
+- `types` type definition file changes
+- `wip` in development
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 0000000..97d1461
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,115 @@
+
+
+
+
Slash Admin
+
+
+
+**中文** | [English](./README.md)
+
+## 简介
+
+Slash Admin 是一个现代化的后台管理模板,基于 React 18、Vite、Ant Design 和 TypeScript 构建。它旨在帮助开发人员快速搭建功能强大的后台管理系统。
+
+## 预览
++ https://admin.slashspaces.com/
+
+![login.png](https://d3george.github.io/github-static/slash-admin/login.jpeg)
+![login_dark.png](https://d3george.github.io/github-static/slash-admin/login_dark.jpeg)
+![analysis.png](https://d3george.github.io/github-static/slash-admin/analysis.png)
+![workbench.png](https://d3george.github.io/github-static/slash-admin/workbench.png)
+## 特性
+
+- 使用 React 18 hooks 进行构建。
+- 基于 Vite 进行快速开发和热模块替换。
+- 集成 Ant Design,提供丰富的 UI 组件和设计模式。
+- 使用 TypeScript 编写,提供类型安全性和更好的开发体验。
+- 响应式设计,适应各种屏幕尺寸和设备。
+- 灵活的路由配置,支持多级嵌套路由。
+- 集成权限管理,根据用户角色控制页面访问权限。
+- 集成国际化支持,轻松切换多语言。
+- 集成常见的后台管理功能,如用户管理、角色管理、权限管理等。
+- 可定制的主题和样式,以满足您的品牌需求。
+- 基于 MSW 和 Faker.js 的Mock方案
+- 使用 Zustand 进行状态管理
+- 使用 React-Query 进行数据获取
+
+## 快速开始
+
+### 获取项目代码
+
+```bash
+git clone https://github.com/d3george/slash-admin.git
+```
+
+### 安装依赖
+
+在项目根目录下运行以下命令安装项目依赖:
+
+```bash
+pnpm install
+```
+
+### 启动开发服务器
+
+运行以下命令以启动开发服务器:
+
+```bash
+pnpm dev
+```
+
+访问 [http://localhost:3001](http://localhost:3001) 查看您的应用程序。
+
+### 构建生产版本
+
+运行以下命令以构建生产版本:
+
+```bash
+pnpm build
+```
+
+构建后的文件将位于 `dist` 目录中。
+
+## 容器化部署
+
+### 构建镜像并运行容器
+#### 构建镜像
+在终端中进入项目根目录,并执行以下命令来构建 Docker 镜像:
+```
+docker build -t your-image-name .
+```
+确保将 `your-image-name` 替换为你自己的镜像名称
+
+#### 运行容器
+使用以下命令在 Docker 容器中运行你的应用:
+```
+docker run -p 3001:80 your-image-name
+```
+这将在容器的端口 `80` (暴露在`Dockerfile`中) 上运行你的应用,并将其映射到你主机的端口 `3001` 上。
+
+现在,你可以通过访问 http://localhost:3001 来查看部署的应用。
+
+
+### 使用docker-compose.yaml
+在终端中进入项目根目录,并执行以下命令来启动 Docker Compose:
+```
+docker-compose up -d
+```
+Docker Compose 根据`docker-compose.yaml`定义的配置构建镜像并在后台运行容器.
+
+容器运行成功后,同样可以通过访问 http://localhost:3001来查看部署的应用。
+
+参考[.commitlint.config.js](./commitlint.config.js)
+
+- `feat` 新功能
+- `fix` 修复bug
+- `docs` 文档注释
+- `style` 代码格式(不影响代码运行的变动)
+- `refactor` 重构
+- `perf` 性能优化
+- `revert` 回滚commit
+- `test` 测试相关
+- `chore` 构建过程或辅助工具的变动
+- `ci` 修改CI配置、脚本
+- `types` 类型定义文件修改
+- `wip` 开发中
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000..66686e4
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,30 @@
+export default {
+ // 继承的规则
+ extends: ['@commitlint/config-conventional'],
+ // 定义规则类型
+ rules: {
+ 'body-leading-blank': [2, 'always'], // 确保提交消息正文之前有一行空白行
+ 'type-empty': [2, 'never'], // 不允许提交消息的 type 类型为空
+ 'subject-case': [0], // subject 大小写不做校验
+ // type 类型定义,表示 git 提交的 type 必须在以下类型范围内
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'feat', // 新功能 feature
+ 'fix', // 修复 bug
+ 'docs', // 文档注释
+ 'style', // 代码格式(不影响代码运行的变动)
+ 'refactor', // 重构(既不增加新功能,也不是修复bug)
+ 'perf', // 性能优化
+ 'test', // 添加疏漏测试或已有测试改动
+ 'chore', // 构建过程或辅助工具的变动
+ 'revert', // 回滚commit
+ 'build', // 构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)',
+ 'ci', // 修改CI配置、脚本
+ 'types', // 类型定义文件修改
+ 'wip', // 开发中
+ ],
+ ],
+ },
+};
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..f69755f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ Slash Admin
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7325030
--- /dev/null
+++ b/package.json
@@ -0,0 +1,118 @@
+{
+ "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",
+ "@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": "^4.36.1",
+ "@tanstack/react-query-devtools": "^4.36.1",
+ "@vitejs/plugin-react": "^4.1.0",
+ "antd": "^5.9.3",
+ "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",
+ "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-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": "^1.3.2",
+ "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..cde67af
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,11576 @@
+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)
+ '@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: ^4.36.1
+ version: 4.36.1(react-dom@18.2.0)(react@18.2.0)
+ '@tanstack/react-query-devtools':
+ specifier: ^4.36.1
+ version: 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0)
+ '@vitejs/plugin-react':
+ specifier: ^4.1.0
+ version: 4.1.0(vite@4.4.11)
+ antd:
+ specifier: ^5.9.3
+ version: 5.9.3(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
+ 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-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@20.9.4)(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: ^1.3.2
+ version: 1.3.2(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@20.9.4)(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:
+
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /@alloc/quick-lru@5.2.0:
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@ampproject/remapping@2.2.1:
+ resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.19
+
+ /@ant-design/colors@7.0.0:
+ resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==}
+ dependencies:
+ '@ctrl/tinycolor': 3.6.1
+ 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.23.2
+ '@emotion/hash': 0.8.0
+ '@emotion/unitless': 0.7.5
+ classnames: 2.3.2
+ csstype: 3.1.2
+ rc-util: 5.38.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.0
+ dev: false
+
+ /@ant-design/icons-svg@4.3.1:
+ resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==}
+ 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.0.0
+ '@ant-design/icons-svg': 4.3.1
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.0.2(react@18.2.0):
+ resolution: {integrity: sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ json2mq: 0.2.0
+ react: 18.2.0
+ resize-observer-polyfill: 1.5.1
+ throttle-debounce: 5.0.0
+ dev: false
+
+ /@babel/cli@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==}
+ engines: {node: '>=6.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@jridgewell/trace-mapping': 0.3.19
+ commander: 4.1.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.5.3
+ dev: false
+
+ /@babel/code-frame@7.22.13:
+ resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.22.20
+ chalk: 2.4.2
+
+ /@babel/compat-data@7.23.2:
+ resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core@7.23.2:
+ resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.2.1
+ '@babel/code-frame': 7.22.13
+ '@babel/generator': 7.23.0
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helpers': 7.23.2
+ '@babel/parser': 7.23.0
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.2
+ '@babel/types': 7.23.0
+ convert-source-map: 2.0.0
+ debug: 4.3.4
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator@7.23.0:
+ resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.19
+ jsesc: 2.5.2
+
+ /@babel/helper-annotate-as-pure@7.22.5:
+ resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15:
+ resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helper-compilation-targets@7.22.15:
+ resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.23.2
+ '@babel/helper-validator-option': 7.22.15
+ browserslist: 4.22.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ semver: 6.3.1
+ dev: false
+
+ /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ regexpu-core: 5.3.2
+ semver: 6.3.1
+ dev: false
+
+ /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ debug: 4.3.4
+ lodash.debounce: 4.0.8
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-environment-visitor@7.22.20:
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-function-name@7.23.0:
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/types': 7.23.0
+
+ /@babel/helper-hoist-variables@7.22.5:
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+
+ /@babel/helper-member-expression-to-functions@7.23.0:
+ resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helper-module-imports@7.22.15:
+ resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+
+ /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+
+ /@babel/helper-optimise-call-expression@7.22.5:
+ resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helper-plugin-utils@7.22.5:
+ resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2):
+ resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-wrap-function': 7.22.20
+ dev: false
+
+ /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2):
+ resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ dev: false
+
+ /@babel/helper-simple-access@7.22.5:
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+
+ /@babel/helper-skip-transparent-expression-wrappers@7.22.5:
+ resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helper-split-export-declaration@7.22.6:
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.23.0
+
+ /@babel/helper-string-parser@7.22.5:
+ resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option@7.22.15:
+ resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-wrap-function@7.22.20:
+ resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-function-name': 7.23.0
+ '@babel/template': 7.22.15
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/helpers@7.23.2:
+ resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.22.15
+ '@babel/traverse': 7.23.2
+ '@babel/types': 7.23.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/highlight@7.22.20:
+ resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+
+ /@babel/parser@7.23.0:
+ resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.23.0
+
+ /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-external-helpers@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-ngnNEWxmykPk82mH4ajZT0qTztr3Je6hrMuKAslZVM8G1YZTENJSYwrIGtt6KOtznug3exmAtF4so/nPqJuA4A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.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.23.2
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.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.23.2
+ '@babel/core': 7.23.2
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2):
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ dev: false
+
+ /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2):
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2):
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2):
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2):
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2):
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2):
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2):
+ resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
+ '@babel/helper-split-export-declaration': 7.22.6
+ globals: 11.12.0
+ dev: false
+
+ /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/template': 7.22.15
+ dev: false
+
+ /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-simple-access': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.20
+ dev: false
+
+ /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.23.2
+ '@babel/core': 7.23.2
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2):
+ resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2):
+ resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2)
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2):
+ resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ regenerator-transform: 0.15.2
+ dev: false
+
+ /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2):
+ resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
+ '@babel/helper-plugin-utils': 7.22.5
+ dev: false
+
+ /@babel/preset-env@7.23.2(@babel/core@7.23.2):
+ resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.23.2
+ '@babel/core': 7.23.2
+ '@babel/helper-compilation-targets': 7.22.15
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-validator-option': 7.22.15
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2)
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2)
+ '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2)
+ '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2)
+ '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2)
+ '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2)
+ '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2)
+ '@babel/types': 7.23.0
+ babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2)
+ babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2)
+ babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2)
+ core-js-compat: 3.33.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.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.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/types': 7.23.0
+ esutils: 2.0.3
+ dev: false
+
+ /@babel/preset-react@7.22.15(@babel/core@7.23.2):
+ resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-validator-option': 7.22.15
+ '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.23.2)
+ '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/preset-typescript@7.23.2(@babel/core@7.23.2):
+ resolution: {integrity: sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-validator-option': 7.22.15
+ '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2)
+ '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.2)
+ dev: false
+
+ /@babel/regjsgen@0.8.0:
+ resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
+ dev: false
+
+ /@babel/runtime@7.23.2:
+ resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.14.0
+
+ /@babel/template@7.22.15:
+ resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.13
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+
+ /@babel/traverse@7.23.2:
+ resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.22.13
+ '@babel/generator': 7.23.0
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types@7.23.0:
+ resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+
+ /@commitlint/cli@17.7.2:
+ resolution: {integrity: sha512-t3N7TZq7lOeqTOyEgfGcaltHqEJf7YDlPg75MldeVPPyz14jZq/+mbGF9tueDLFX8R6RwdymrN6D+U5XwZ8Iwg==}
+ engines: {node: '>=v14'}
+ hasBin: true
+ dependencies:
+ '@commitlint/format': 17.4.4
+ '@commitlint/lint': 17.7.0
+ '@commitlint/load': 17.7.2
+ '@commitlint/read': 17.5.1
+ '@commitlint/types': 17.4.4
+ 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.6.7:
+ resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.4.4
+ ajv: 8.12.0
+ dev: true
+
+ /@commitlint/ensure@17.6.7:
+ resolution: {integrity: sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.4.4
+ 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.4.0:
+ resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/format@17.4.4:
+ resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.4.4
+ chalk: 4.1.2
+ dev: true
+
+ /@commitlint/is-ignored@17.7.0:
+ resolution: {integrity: sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.4.4
+ semver: 7.5.4
+ dev: true
+
+ /@commitlint/lint@17.7.0:
+ resolution: {integrity: sha512-TCQihm7/uszA5z1Ux1vw+Nf3yHTgicus/+9HiUQk+kRSQawByxZNESeQoX9ujfVd3r4Sa+3fn0JQAguG4xvvbA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/is-ignored': 17.7.0
+ '@commitlint/parse': 17.7.0
+ '@commitlint/rules': 17.7.0
+ '@commitlint/types': 17.4.4
+ dev: true
+
+ /@commitlint/load@17.7.2:
+ resolution: {integrity: sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.6.7
+ '@commitlint/execute-rule': 17.4.0
+ '@commitlint/resolve-extends': 17.6.7
+ '@commitlint/types': 17.4.4
+ '@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.4.2:
+ resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/parse@17.7.0:
+ resolution: {integrity: sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/types': 17.4.4
+ conventional-changelog-angular: 6.0.0
+ conventional-commits-parser: 4.0.0
+ dev: true
+
+ /@commitlint/read@17.5.1:
+ resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/top-level': 17.4.0
+ '@commitlint/types': 17.4.4
+ fs-extra: 11.1.1
+ git-raw-commits: 2.0.11
+ minimist: 1.2.8
+ dev: true
+
+ /@commitlint/resolve-extends@17.6.7:
+ resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/config-validator': 17.6.7
+ '@commitlint/types': 17.4.4
+ 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.7.0:
+ resolution: {integrity: sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==}
+ engines: {node: '>=v14'}
+ dependencies:
+ '@commitlint/ensure': 17.6.7
+ '@commitlint/message': 17.4.2
+ '@commitlint/to-lines': 17.4.0
+ '@commitlint/types': 17.4.4
+ execa: 5.1.1
+ dev: true
+
+ /@commitlint/to-lines@17.4.0:
+ resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==}
+ engines: {node: '>=v14'}
+ dev: true
+
+ /@commitlint/top-level@17.4.0:
+ resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==}
+ engines: {node: '>=v14'}
+ dependencies:
+ find-up: 5.0.0
+ dev: true
+
+ /@commitlint/types@17.4.4:
+ resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==}
+ 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.3.2(@csstools/css-tokenizer@2.2.1):
+ resolution: {integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^2.2.1
+ dependencies:
+ '@csstools/css-tokenizer': 2.2.1
+ dev: true
+
+ /@csstools/css-tokenizer@2.2.1:
+ resolution: {integrity: sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==}
+ engines: {node: ^14 || ^16 || >=18}
+ dev: true
+
+ /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1):
+ resolution: {integrity: sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^2.3.2
+ '@csstools/css-tokenizer': ^2.2.1
+ dependencies:
+ '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1)
+ '@csstools/css-tokenizer': 2.2.1
+ dev: true
+
+ /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13):
+ resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.10
+ dependencies:
+ postcss-selector-parser: 6.0.13
+ dev: true
+
+ /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13):
+ resolution: {integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss-selector-parser: ^6.0.13
+ dependencies:
+ postcss-selector-parser: 6.0.13
+ 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.11.0:
+ resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
+ dependencies:
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/runtime': 7.23.2
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/serialize': 1.1.2
+ 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
+ dev: false
+
+ /@emotion/cache@11.11.0:
+ resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
+ dependencies:
+ '@emotion/memoize': 0.8.1
+ '@emotion/sheet': 1.2.2
+ '@emotion/utils': 1.2.1
+ '@emotion/weak-memoize': 0.3.1
+ stylis: 4.2.0
+ dev: false
+
+ /@emotion/css@11.11.2:
+ resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==}
+ dependencies:
+ '@emotion/babel-plugin': 11.11.0
+ '@emotion/cache': 11.11.0
+ '@emotion/serialize': 1.1.2
+ '@emotion/sheet': 1.2.2
+ '@emotion/utils': 1.2.1
+ dev: false
+
+ /@emotion/hash@0.8.0:
+ resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+ dev: false
+
+ /@emotion/hash@0.9.1:
+ resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+ 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.2.1:
+ resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==}
+ dependencies:
+ '@emotion/memoize': 0.8.1
+ dev: false
+
+ /@emotion/memoize@0.7.4:
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@emotion/memoize@0.8.1:
+ resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+ dev: false
+
+ /@emotion/serialize@1.1.2:
+ resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==}
+ dependencies:
+ '@emotion/hash': 0.9.1
+ '@emotion/memoize': 0.8.1
+ '@emotion/unitless': 0.8.1
+ '@emotion/utils': 1.2.1
+ csstype: 3.1.2
+ dev: false
+
+ /@emotion/sheet@1.2.2:
+ resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
+ 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/utils@1.2.1:
+ resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
+ dev: false
+
+ /@emotion/weak-memoize@0.3.1:
+ resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
+ 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.9.1:
+ resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc@2.1.2:
+ resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.6.1
+ globals: 13.23.0
+ ignore: 5.2.4
+ 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.2
+ 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.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-hbyXAPU0r9psO0oH22ge0GCxQhlHQ0KJRJhAM2KkTTfYUSAYgaaYfX9cUC6ysNE7T1gZ5JDlYDu/xskwPymyvA==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ 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.9(@fullcalendar/core@6.1.9):
+ resolution: {integrity: sha512-mrdNb0kgDrs15oesKFfr475UYEuqAEQmxBJB2IjQVUL1v213ZqY1TYzgXsIQhVmyGudosVbBOaiQ+vb0zMk8HA==}
+ peerDependencies:
+ '@fullcalendar/core': ~6.1.9
+ dependencies:
+ '@fullcalendar/core': 6.1.9
+ '@fullcalendar/premium-common': 6.1.9(@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.9(@fullcalendar/core@6.1.9)
+ '@fullcalendar/scrollgrid': 6.1.9(@fullcalendar/core@6.1.9)
+ dev: false
+
+ /@humanwhocodes/config-array@0.11.11:
+ resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ 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@1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ 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
+
+ /@jridgewell/gen-mapping@0.3.3:
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.19
+
+ /@jridgewell/resolve-uri@3.1.1:
+ resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/set-array@1.1.2:
+ resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/source-map@0.3.5:
+ resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ '@jridgewell/trace-mapping': 0.3.19
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ /@jridgewell/trace-mapping@0.3.19:
+ resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+
+ /@jridgewell/trace-mapping@0.3.9:
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ 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@0.2.2:
+ resolution: {integrity: sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@types/set-cookie-parser': 2.4.4
+ set-cookie-parser: 2.6.0
+ dev: true
+
+ /@mswjs/interceptors@0.17.10:
+ resolution: {integrity: sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@open-draft/until': 1.0.3
+ '@types/debug': 4.1.9
+ '@xmldom/xmldom': 0.8.10
+ debug: 4.3.4
+ headers-polyfill: 3.2.5
+ outvariant: 1.4.0
+ strict-event-emitter: 0.2.8
+ web-encoding: 1.1.5
+ transitivePeerDependencies:
+ - supports-color
+ 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.15.0
+ dev: true
+
+ /@open-draft/until@1.0.3:
+ resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==}
+ dev: true
+
+ /@rc-component/color-picker@1.4.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@ctrl/tinycolor': 3.6.1
+ classnames: 2.3.2
+ rc-util: 5.38.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.23.2
+ rc-util: 5.38.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.23.2
+ 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.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.10.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-util: 5.38.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@1.17.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-KN+lKHCi7L4kjuA9DU2PnwZxtIyes6R1wsexp0/Rnjr/ITELsPuC9kpzDK1+7AZMarDXUAHUdDGS2zUNEx2P0g==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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
+
+ /@tanstack/match-sorter-utils@8.8.4:
+ resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==}
+ engines: {node: '>=12'}
+ dependencies:
+ remove-accents: 0.4.2
+ dev: false
+
+ /@tanstack/query-core@4.36.1:
+ resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==}
+ dev: false
+
+ /@tanstack/react-query-devtools@4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-WYku83CKP3OevnYSG8Y/QO9g0rT75v1om5IvcWUwiUZJ4LanYGLVCZ8TdFG5jfsq4Ej/lu2wwDAULEUnRIMBSw==}
+ peerDependencies:
+ '@tanstack/react-query': ^4.36.1
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@tanstack/match-sorter-utils': 8.8.4
+ '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ superjson: 1.13.3
+ use-sync-external-store: 1.2.0(react@18.2.0)
+ dev: false
+
+ /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ '@tanstack/query-core': 4.36.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ use-sync-external-store: 1.2.0(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.9:
+ resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+ 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.2:
+ resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ '@types/babel__generator': 7.6.5
+ '@types/babel__template': 7.4.2
+ '@types/babel__traverse': 7.20.2
+ dev: false
+
+ /@types/babel__generator@7.6.5:
+ resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@types/babel__template@7.4.2:
+ resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==}
+ dependencies:
+ '@babel/parser': 7.23.0
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@types/babel__traverse@7.20.2:
+ resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==}
+ dependencies:
+ '@babel/types': 7.23.0
+ dev: false
+
+ /@types/color-convert@2.0.1:
+ resolution: {integrity: sha512-GwXanrvq/tBHJtudbl1lSy9Ybt7KS9+rA+YY3bcuIIM+d6jSHUr+5yjO83gtiRpuaPiBccwFjSnAK2qSrIPA7w==}
+ dependencies:
+ '@types/color-name': 1.1.1
+ dev: true
+
+ /@types/color-name@1.1.1:
+ resolution: {integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==}
+ dev: true
+
+ /@types/color@3.0.4:
+ resolution: {integrity: sha512-OpisS4bqJJwbkkQRrMvURf3DOxBoAg9mysHYI7WgrWpSYHqHGKYBULHdz4ih77SILcLDo/zyHGFyfIl9yb8NZQ==}
+ dependencies:
+ '@types/color-convert': 2.0.1
+ dev: true
+
+ /@types/cookie@0.4.1:
+ resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
+ dev: true
+
+ /@types/debug@4.1.9:
+ resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==}
+ dependencies:
+ '@types/ms': 0.7.32
+
+ /@types/glob@7.2.0:
+ resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
+ dependencies:
+ '@types/minimatch': 5.1.2
+ '@types/node': 20.8.5
+ dev: true
+
+ /@types/hast@2.3.6:
+ resolution: {integrity: sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==}
+ dependencies:
+ '@types/unist': 2.0.8
+ dev: false
+
+ /@types/history@4.7.11:
+ resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
+ dev: true
+
+ /@types/hoist-non-react-statics@3.3.3:
+ resolution: {integrity: sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==}
+ 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/js-levenshtein@1.1.1:
+ resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==}
+ dev: true
+
+ /@types/json-schema@7.0.13:
+ resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/lodash-es@4.17.9:
+ resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==}
+ dependencies:
+ '@types/lodash': 4.14.199
+ dev: false
+
+ /@types/lodash@4.14.199:
+ resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==}
+ dev: false
+
+ /@types/mdast@3.0.13:
+ resolution: {integrity: sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==}
+ dependencies:
+ '@types/unist': 2.0.8
+ dev: false
+
+ /@types/minimatch@5.1.2:
+ resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
+ dev: true
+
+ /@types/minimist@1.2.3:
+ resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==}
+ dev: true
+
+ /@types/ms@0.7.32:
+ resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==}
+
+ /@types/node@20.5.1:
+ resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==}
+ dev: true
+
+ /@types/node@20.8.5:
+ resolution: {integrity: sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==}
+ dependencies:
+ undici-types: 5.25.3
+ dev: true
+
+ /@types/node@20.9.4:
+ resolution: {integrity: sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==}
+ dependencies:
+ undici-types: 5.26.5
+
+ /@types/normalize-package-data@2.4.2:
+ resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==}
+ 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.8:
+ resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==}
+
+ /@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.5
+ 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.28:
+ resolution: {integrity: sha512-EQr7cChVzVUuqbA+J8ArWK1H0hLAHKOs21SIMrskKZ3nHNeE+LFYA+IsoZGhVOT8Ktjn3M20v4rnZKN3fLbypw==}
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.3
+ '@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.8
+ '@types/scheduler': 0.16.4
+ csstype: 3.1.2
+
+ /@types/scheduler@0.16.4:
+ resolution: {integrity: sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==}
+
+ /@types/semver@7.5.3:
+ resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==}
+ dev: true
+
+ /@types/set-cookie-parser@2.4.4:
+ resolution: {integrity: sha512-xCfTC/eL/GmvMC24b42qJpYSTdCIBwWcfskDF80ztXtnU6pKXyvuZP2EConb2K9ps0s7gMhCa0P1foy7wiItMA==}
+ dependencies:
+ '@types/node': 20.8.5
+ dev: true
+
+ /@types/styled-components@5.1.28:
+ resolution: {integrity: sha512-nu0VKNybkjvUqJAXWtRqKd7j3iRUl8GbYSTvZNuIBJcw/HUp1Y4QUXNLlj7gcnRV/t784JnHAlvRnSnE3nPbJA==}
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.3
+ '@types/react': 18.2.28
+ csstype: 3.1.2
+ dev: true
+
+ /@types/stylis@4.2.1:
+ resolution: {integrity: sha512-OSaMrXUKxVigGlKRrET39V2xdhzlztQ9Aqumn1WbCBKHOi9ry7jKSd7rkyj0GzmWaU960Rd+LpOFpLfx5bMQAg==}
+ dev: false
+
+ /@types/svgo@2.6.4:
+ resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+ dependencies:
+ '@types/node': 20.8.5
+ dev: true
+
+ /@types/unist@2.0.8:
+ resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==}
+
+ /@types/unist@3.0.0:
+ resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==}
+ 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': 20.8.5
+ '@types/unist': 2.0.8
+ '@types/vfile-message': 2.0.0
+ 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.9.1
+ '@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.4
+ eslint: 8.51.0
+ graphemer: 1.4.0
+ ignore: 5.2.4
+ natural-compare-lite: 1.4.0
+ semver: 7.5.4
+ 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.4
+ 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.4
+ 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.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.5.4
+ 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.13
+ '@types/semver': 7.5.3
+ '@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.5.4
+ 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
+
+ /@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.23.2
+ '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2)
+ '@types/babel__core': 7.20.2
+ react-refresh: 0.14.0
+ vite: 4.4.11(@types/node@20.9.4)(sass@1.69.3)(terser@5.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@xmldom/xmldom@0.8.10:
+ resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
+ engines: {node: '>=10.0.0'}
+ dev: true
+
+ /@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
+
+ /@zxing/text-encoding@0.9.0:
+ resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==}
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /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.10.0):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.10.0
+ dev: true
+
+ /acorn-walk@8.2.0:
+ resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn@8.10.0:
+ resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
+ 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.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ 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.9.3(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-a7gY6hfsjoDLOENHKzjXZgmAxi1hDdsuIvYm6YMTctb08EhTEXCZoeFOekwz9S0vrTcdSpUMblRWsiwuYRdPYg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@ant-design/colors': 7.0.0
+ '@ant-design/cssinjs': 1.17.2(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/icons': 5.2.6(react-dom@18.2.0)(react@18.2.0)
+ '@ant-design/react-slick': 1.0.2(react@18.2.0)
+ '@babel/runtime': 7.23.2
+ '@ctrl/tinycolor': 3.6.1
+ '@rc-component/color-picker': 1.4.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/tour': 1.10.0(react-dom@18.2.0)(react@18.2.0)
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ copy-to-clipboard: 3.3.3
+ dayjs: 1.11.10
+ qrcode.react: 3.1.0(react@18.2.0)
+ rc-cascader: 3.17.0(react-dom@18.2.0)(react@18.2.0)
+ rc-checkbox: 3.1.0(react-dom@18.2.0)(react@18.2.0)
+ rc-collapse: 3.7.1(react-dom@18.2.0)(react@18.2.0)
+ rc-dialog: 9.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-drawer: 6.4.1(react-dom@18.2.0)(react@18.2.0)
+ rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+ rc-field-form: 1.38.2(react-dom@18.2.0)(react@18.2.0)
+ rc-image: 7.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0)
+ rc-input-number: 8.1.0(react-dom@18.2.0)(react@18.2.0)
+ rc-mentions: 2.8.0(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-notification: 5.1.1(react-dom@18.2.0)(react@18.2.0)
+ rc-pagination: 3.6.1(react-dom@18.2.0)(react@18.2.0)
+ rc-picker: 3.14.5(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0)
+ rc-progress: 3.5.1(react-dom@18.2.0)(react@18.2.0)
+ rc-rate: 2.12.0(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-segmented: 2.2.2(react-dom@18.2.0)(react@18.2.0)
+ rc-select: 14.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-slider: 10.2.1(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.34.4(react-dom@18.2.0)(react@18.2.0)
+ rc-tabs: 12.12.1(react-dom@18.2.0)(react@18.2.0)
+ rc-textarea: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-tooltip: 6.0.1(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0)
+ rc-tree-select: 5.13.0(react-dom@18.2.0)(react@18.2.0)
+ rc-upload: 4.3.5(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.0
+ 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.0:
+ resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ dependencies:
+ call-bind: 1.0.2
+ is-array-buffer: 3.0.2
+ 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.7:
+ resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ get-intrinsic: 1.2.1
+ 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.3:
+ resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ es-shim-unscopables: 1.0.0
+ get-intrinsic: 1.2.1
+ 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.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ es-shim-unscopables: 1.0.0
+ 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.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ es-shim-unscopables: 1.0.0
+ dev: true
+
+ /array.prototype.tosorted@1.1.2:
+ resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ es-shim-unscopables: 1.0.0
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.2:
+ resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ get-intrinsic: 1.2.1
+ is-array-buffer: 3.0.2
+ is-shared-array-buffer: 1.0.2
+ 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
+
+ /async-validator@4.2.5:
+ resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+ dev: false
+
+ /asynciterator.prototype@1.0.0:
+ resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==}
+ dependencies:
+ has-symbols: 1.0.3
+ 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.22.1
+ caniuse-lite: 1.0.30001547
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.0.0
+ 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.22.1
+ caniuse-lite: 1.0.30001547
+ 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.5:
+ resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /axe-core@4.8.2:
+ resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axios@1.5.1:
+ resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==}
+ dependencies:
+ follow-redirects: 1.15.3
+ form-data: 4.0.0
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /axobject-query@3.2.1:
+ resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+ dependencies:
+ '@babel/runtime': 7.23.2
+ cosmiconfig: 7.1.0
+ resolve: 1.22.8
+ dev: false
+
+ /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2):
+ resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/compat-data': 7.23.2
+ '@babel/core': 7.23.2
+ '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2):
+ resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2)
+ core-js-compat: 3.33.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2):
+ resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.23.2
+ '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.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
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ 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.0
+ 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.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /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
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /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.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+
+ /browserslist@4.22.1:
+ resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001547
+ electron-to-chromium: 1.4.553
+ node-releases: 2.0.13
+ update-browserslist-db: 1.0.13(browserslist@4.22.1)
+
+ /buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: true
+
+ /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.0
+ 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.2:
+ resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ dependencies:
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.1
+
+ /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
+
+ /can-use-dom@0.1.0:
+ resolution: {integrity: sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==}
+ dev: false
+
+ /caniuse-lite@1.0.30001547:
+ resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==}
+
+ /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
+
+ /chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: true
+
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ 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
+
+ /cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: true
+
+ /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.1:
+ resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==}
+ 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@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+ 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@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+ 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'}
+
+ /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.0:
+ resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
+ 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.4.2:
+ resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
+ /copy-anything@3.0.5:
+ resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+ engines: {node: '>=12.13'}
+ dependencies:
+ is-what: 4.1.15
+ dev: false
+
+ /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.33.0:
+ resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==}
+ dependencies:
+ browserslist: 4.22.1
+ 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.1
+ dev: false
+
+ /css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /css-functions-list@3.2.0:
+ resolution: {integrity: sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /css-in-js-utils@3.1.0:
+ resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ dependencies:
+ hyphenate-style-name: 1.0.4
+ 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.0.2
+ 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.2:
+ resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+
+ /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
+
+ /dayjs@1.11.10:
+ resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==}
+ 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
+
+ /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.1:
+ resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==}
+ dependencies:
+ is-arguments: 1.1.1
+ is-date-object: 1.0.5
+ is-regex: 1.1.4
+ object-is: 1.1.5
+ object-keys: 1.1.1
+ regexp.prototype.flags: 1.5.1
+ dev: false
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+ dependencies:
+ clone: 1.0.4
+ dev: true
+
+ /define-data-property@1.1.1:
+ resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.1
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.0
+
+ /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.1
+ has-property-descriptors: 1.0.0
+ 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.6
+ dev: true
+
+ /define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.2
+ dev: true
+
+ /define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-descriptor: 1.0.2
+ 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.1.0:
+ resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+ 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-align@1.12.4:
+ resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
+ dev: false
+
+ /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.4.553:
+ resolution: {integrity: sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==}
+
+ /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.22.2:
+ resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.0
+ arraybuffer.prototype.slice: 1.0.2
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ es-set-tostringtag: 2.0.1
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.1
+ get-symbol-description: 1.0.0
+ globalthis: 1.0.3
+ gopd: 1.0.1
+ has: 1.0.4
+ has-property-descriptors: 1.0.0
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.5
+ is-array-buffer: 3.0.2
+ is-callable: 1.2.7
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-typed-array: 1.1.12
+ is-weakref: 1.0.2
+ object-inspect: 1.12.3
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.5.1
+ safe-array-concat: 1.0.1
+ safe-regex-test: 1.0.0
+ string.prototype.trim: 1.2.8
+ string.prototype.trimend: 1.0.7
+ string.prototype.trimstart: 1.0.7
+ typed-array-buffer: 1.0.0
+ typed-array-byte-length: 1.0.0
+ typed-array-byte-offset: 1.0.0
+ typed-array-length: 1.0.4
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.11
+ dev: true
+
+ /es-iterator-helpers@1.0.15:
+ resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==}
+ dependencies:
+ asynciterator.prototype: 1.0.0
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ es-set-tostringtag: 2.0.1
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.1
+ globalthis: 1.0.3
+ has-property-descriptors: 1.0.0
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.5
+ iterator.prototype: 1.1.2
+ safe-array-concat: 1.0.1
+ dev: true
+
+ /es-set-tostringtag@2.0.1:
+ resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.1
+ has: 1.0.4
+ has-tostringtag: 1.0.0
+ dev: true
+
+ /es-shim-unscopables@1.0.0:
+ resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ dependencies:
+ has: 1.0.4
+ 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.1:
+ resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+ 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.4
+ object.entries: 1.1.7
+ 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.4
+ object.entries: 1.1.7
+ 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.13.0
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0):
+ resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
+ 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.7
+ array.prototype.findlastindex: 1.2.3
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.51.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.0(@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.13.0
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.7
+ object.groupby: 1.0.1
+ object.values: 1.1.7
+ semver: 6.3.1
+ tsconfig-paths: 3.14.2
+ 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.23.2
+ aria-query: 5.3.0
+ array-includes: 3.1.7
+ array.prototype.flatmap: 1.3.2
+ ast-types-flow: 0.0.7
+ axe-core: 4.8.2
+ axobject-query: 3.2.1
+ 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.7
+ object.fromentries: 2.0.7
+ 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.7
+ array.prototype.flatmap: 1.3.2
+ array.prototype.tosorted: 1.1.2
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.0.15
+ eslint: 8.51.0
+ estraverse: 5.3.0
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.7
+ object.fromentries: 2.0.7
+ object.hasown: 1.1.3
+ object.values: 1.1.7
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.10
+ 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.9.1
+ '@eslint/eslintrc': 2.1.2
+ '@eslint/js': 8.51.0
+ '@humanwhocodes/config-array': 0.11.11
+ '@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.4
+ 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.5.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.23.0
+ graphemer: 1.4.0
+ ignore: 5.2.4
+ 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.3
+ 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.10.0
+ acorn-jsx: 5.3.2(acorn@8.10.0)
+ 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.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ 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
+
+ /events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+ 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.1.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==}
+
+ /external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: true
+
+ /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.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ 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.5
+ 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-loops@1.1.3:
+ resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==}
+ dev: false
+
+ /fast-shallow-equal@1.0.0:
+ resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
+ 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.15.0:
+ resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fault@2.0.1:
+ resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
+ dependencies:
+ format: 0.2.2
+ dev: false
+
+ /figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: true
+
+ /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.1.1
+ 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.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ 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.1.1:
+ resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ flatted: 3.2.9
+ keyv: 4.5.4
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted@2.0.2:
+ resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==}
+ dev: true
+
+ /flatted@3.2.9:
+ resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
+ dev: true
+
+ /follow-redirects@1.15.3:
+ resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
+ 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
+
+ /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.2
+ 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.0
+ dev: true
+
+ /fs-extra@11.1.1:
+ resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.0
+ 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.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ 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.1:
+ resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ dependencies:
+ function-bind: 1.1.2
+ has: 1.0.4
+ has-proto: 1.0.1
+ has-symbols: 1.0.3
+
+ /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.0:
+ resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ 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@7.1.6:
+ resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
+ 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
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ 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.23.0:
+ resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalthis@1.0.3:
+ resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.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.1
+ ignore: 5.2.4
+ 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.1
+
+ /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.8.1:
+ resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==}
+ 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.0:
+ resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ dependencies:
+ get-intrinsic: 1.2.1
+
+ /has-proto@1.0.1:
+ resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+ engines: {node: '>= 0.4'}
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ /has-tostringtag@1.0.0:
+ resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+ 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'}
+
+ /hast-util-from-parse5@7.1.2:
+ resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==}
+ dependencies:
+ '@types/hast': 2.3.6
+ '@types/unist': 2.0.8
+ hastscript: 7.2.0
+ property-information: 6.3.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.6
+ '@types/unist': 2.0.8
+ dev: false
+
+ /hast-util-parse-selector@3.1.1:
+ resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
+ dependencies:
+ '@types/hast': 2.3.6
+ dev: false
+
+ /hast-util-raw@7.2.3:
+ resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==}
+ dependencies:
+ '@types/hast': 2.3.6
+ '@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.6
+ comma-separated-tokens: 2.0.3
+ property-information: 6.3.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.6
+ '@types/unist': 2.0.8
+ 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.6
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 3.1.1
+ property-information: 6.3.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@3.2.5:
+ resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==}
+ 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.0.4:
+ resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==}
+ dev: false
+
+ /i18next-browser-languagedetector@7.1.0:
+ resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==}
+ dependencies:
+ '@babel/runtime': 7.23.2
+ dev: false
+
+ /i18next@23.5.1:
+ resolution: {integrity: sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg==}
+ dependencies:
+ '@babel/runtime': 7.23.2
+ dev: false
+
+ /iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ dev: true
+
+ /ignore@4.0.6:
+ resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /ignore@5.2.4:
+ resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+ 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.4:
+ resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==}
+
+ /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==}
+ 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@6.0.4:
+ resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==}
+ dependencies:
+ css-in-js-utils: 3.1.0
+ fast-loops: 1.1.3
+ dev: false
+
+ /inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+ dev: true
+
+ /internal-slot@1.0.5:
+ resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.1
+ has: 1.0.4
+ side-channel: 1.0.4
+ dev: true
+
+ /invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /is-accessor-descriptor@0.1.6:
+ resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-accessor-descriptor@1.0.0:
+ resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 6.0.3
+ 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.2
+ has-tostringtag: 1.0.0
+
+ /is-array-buffer@3.0.2:
+ resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ is-typed-array: 1.1.12
+ 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.0
+ 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.2.0
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ has-tostringtag: 1.0.0
+ 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.13.0:
+ resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
+ dependencies:
+ has: 1.0.4
+
+ /is-data-descriptor@0.1.4:
+ resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 3.2.2
+ dev: true
+
+ /is-data-descriptor@1.0.0:
+ resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ kind-of: 6.0.3
+ dev: true
+
+ /is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.0
+
+ /is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+ dev: true
+
+ /is-descriptor@0.1.6:
+ resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-accessor-descriptor: 0.1.6
+ is-data-descriptor: 0.1.4
+ kind-of: 5.1.0
+ dev: true
+
+ /is-descriptor@1.0.2:
+ resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-accessor-descriptor: 1.0.0
+ is-data-descriptor: 1.0.0
+ kind-of: 6.0.3
+ 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.2
+ 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.0
+ 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-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-map@2.0.2:
+ resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+ dev: true
+
+ /is-negative-zero@2.0.2:
+ resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+ 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.0
+ 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.2
+ has-tostringtag: 1.0.0
+
+ /is-regexp@1.0.0:
+ resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-set@2.0.2:
+ resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
+ dev: true
+
+ /is-shared-array-buffer@1.0.2:
+ resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ dependencies:
+ call-bind: 1.0.2
+ 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.0
+ 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.12:
+ resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.11
+ dev: true
+
+ /is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /is-weakmap@2.0.1:
+ resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+ dev: true
+
+ /is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.2
+ dev: true
+
+ /is-weakset@2.0.2:
+ resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /is-what@4.1.15:
+ resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==}
+ engines: {node: '>=12.13'}
+ dev: false
+
+ /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.1
+ has-symbols: 1.0.3
+ reflect.getprototypeof: 1.0.4
+ set-function-name: 2.0.1
+ dev: true
+
+ /jiti@1.20.0:
+ resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==}
+ 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-levenshtein@1.1.6:
+ resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /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.0
+ 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.7
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.4
+ object.values: 1.1.7
+ 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.22:
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: true
+
+ /language-tags@1.0.5:
+ resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
+ dependencies:
+ language-subtag-registry: 0.3.22
+ 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
+
+ /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.3.0
+ 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-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ 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.6
+ fault: 2.0.1
+ highlight.js: 11.8.0
+ dev: false
+
+ /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.13
+ '@types/unist': 2.0.8
+ 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.13
+ 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.13
+ '@types/unist': 2.0.8
+ 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.13
+ 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.13
+ 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.13
+ 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.13
+ 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.13
+ 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.13
+ 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.6
+ '@types/mdast': 3.0.13
+ 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.13
+ '@types/unist': 2.0.8
+ 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.13
+ 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.3
+ 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.3
+ 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.9
+ debug: 4.3.4
+ 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.2
+ 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
+
+ /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
+
+ /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@1.3.2(typescript@5.2.2):
+ resolution: {integrity: sha512-wKLhFPR+NitYTkQl5047pia0reNGgf0P6a1eTnA5aNlripmiz0sabMvvHcicE8kQ3/gZcI0YiPFWmYfowfm3lA==}
+ engines: {node: '>=14'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ typescript: '>= 4.4.x <= 5.2.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@mswjs/cookies': 0.2.2
+ '@mswjs/interceptors': 0.17.10
+ '@open-draft/until': 1.0.3
+ '@types/cookie': 0.4.1
+ '@types/js-levenshtein': 1.1.1
+ chalk: 4.1.2
+ chokidar: 3.5.3
+ cookie: 0.4.2
+ graphql: 16.8.1
+ headers-polyfill: 3.2.5
+ inquirer: 8.2.6
+ is-node-process: 1.2.0
+ js-levenshtein: 1.1.6
+ node-fetch: 2.7.0
+ outvariant: 1.4.0
+ path-to-regexp: 6.2.1
+ strict-event-emitter: 0.4.6
+ type-fest: 2.19.0
+ typescript: 5.2.2
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+ 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.3.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ css-tree: 1.1.3
+ csstype: 3.1.2
+ fastest-stable-stringify: 2.0.2
+ inline-style-prefixer: 6.0.4
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ rtl-css-js: 1.16.1
+ sourcemap-codec: 1.4.8
+ stacktrace-js: 2.0.2
+ stylis: 4.3.0
+ dev: false
+
+ /nanoid@3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ 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-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-releases@2.0.13:
+ resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
+
+ /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.13.0
+ semver: 7.5.4
+ 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.1.0:
+ resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+ 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.12.3:
+ resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+ dev: true
+
+ /object-is@1.1.5:
+ resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ 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.4:
+ resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /object.entries@1.1.7:
+ resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ dev: true
+
+ /object.fromentries@2.0.7:
+ resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ dev: true
+
+ /object.groupby@1.0.1:
+ resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ get-intrinsic: 1.2.1
+ dev: true
+
+ /object.hasown@1.1.3:
+ resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==}
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ 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.1.7:
+ resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ 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.3:
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.1
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+ dev: true
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /outvariant@1.4.0:
+ resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==}
+ 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
+
+ /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.22.13
+ 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-to-regexp@6.2.1:
+ resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
+ 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.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+ /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
+
+ /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.23.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.1(postcss@8.4.31)(ts-node@10.9.1):
+ resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.1.0
+ postcss: 8.4.31
+ ts-node: 10.9.1(@types/node@20.9.4)(typescript@5.2.2)
+ yaml: 2.3.2
+ 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.0.1(postcss@8.4.31):
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.0.13
+ 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.0.13)
+ postcss: 8.4.31
+ postcss-selector-parser: 6.0.13
+ dev: true
+
+ /postcss-prefix-selector@1.16.0(postcss@5.2.18):
+ resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==}
+ 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.1:
+ resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
+ 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.0.13:
+ resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
+ 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.6
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+
+ /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.3.0:
+ resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==}
+ dev: false
+
+ /proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ dev: false
+
+ /punycode@2.3.0:
+ resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /qrcode.react@3.1.0(react@18.2.0):
+ resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ 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.1
+ 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.1
+ 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-align@4.0.15(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ dom-align: 1.12.4
+ rc-util: 5.38.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-cascader@3.17.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-8O5Eq/NteRuBaaUIb+ZsTEkNKM3BwWKizsFlSpukCVa2ELqrdMyslbe/OdxtuFlyJIqGyWF5rS2Q+fd0Rpvmgw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ array-tree-filter: 2.1.0
+ classnames: 2.3.2
+ rc-select: 14.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-dL2tklMou/QfK77+0CTH3FTnKCvIiYv9Df7PfFfg8YVXhYAGmuIkV4ooQYHAIR4juL3Ywcm5oQflF2vDDuGlUg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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@6.4.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-QIbNMjiZy322o9uEpJHsSZ5rS/zuxqam3lYVPDzjztoqsoDzTNNxWN77QVpOfQ0UC9/87+qu25zocJ+O9bK2Tg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==}
+ peerDependencies:
+ react: '>=16.11.0'
+ react-dom: '>=16.11.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-util: 5.38.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@1.38.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ async-validator: 4.2.5
+ rc-util: 5.38.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.2.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-5Ug2hCVl6VcT0osR5XaZQ4zclTMEWPnbn3b4/TS/MR1QjRpEACLNFUzBGwr5mbAVhzvLWX5YZf4vO10xUA5IUA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-dialog: 9.2.0(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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@8.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-bdHgduOxuN0lrhzgPmoKbhRD4GLIzVcddVz972/JHPHr7oLwPX5xDb9w4bXhuMzyT2VzQy7nggRCfH3yAl09oA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/mini-decimal': 1.1.0
+ classnames: 2.3.2
+ rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.2.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-nQRmBvEFoGi+SNRDavccZ8ueyhFgmxkWqIt4aDyuNJgUZF12HJKIwDhAafUM7N+g7PyuW9FH3pf3zPHzdiCWbA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.8.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-LBMkO6bSGhEvS1CvMK978qGN82tI+mzk7l/uTiQJH+UDiwpvq+pxK4DxU5b6Q1T5LW6bn2pSua9RaZKZrDoBOw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0)
+ rc-textarea: 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.12.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.0(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.38.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.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.1.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BPnded/WmWFE57ubqhVCgRSuedfQQNeSOYqdwppyr2B/Wt909gYFKyWAkFJVXuppAjsOGop05a93UaxjmUFdkg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.23.2
+ classnames: 2.3.2
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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@3.6.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-R/sUnKKXx1Nm4kZfUKS3YKa7yEPF1ZkVB/AynQaHt+nMER7h9wPTfliDJFdYo+RM/nk2JD4Yc5QpUq8fIQHeug==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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@3.14.5(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-h0O8b5AYfWwHSRUUH/9F2oBXB5gZerHIyGG6z2r5rn/kfSQodyCXEO4GNqrG30iUC1qkvLFIOn/JqI4XaO0+2A==}
+ 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.23.2
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ dayjs: 1.11.10
+ rc-util: 5.38.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@3.5.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.12.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.3.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.2.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==}
+ peerDependencies:
+ react: '>=16.0.0'
+ react-dom: '>=16.0.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.9.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-vbIhK1MBA12MRdxXbiylSCTPKsWV8WmeN7OyATk9I0LsuIVwe/kBAUNH02am1ryjoylbK+AH309a6X1AflGRSw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/trigger': 1.17.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-motion: 2.9.0(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.38.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.11.2(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@10.2.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-l355C/65iV4UFp7mXq5xBTNX2/tF2g74VWiTVlTpNp+6vjE/xaHHNiQq5Af+Uu28uUiqCuH/QXs5HfADL9KJ/A==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.34.4(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-os+i88Y2AO/6dNkOgJkKSHgXYaZZGnuOEEe+nyaq5IRgvAQNhLysUjXt2objtBeFDEZR8TqXrajwBNRUwunmdw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/context': 1.4.0(react-dom@18.2.0)(react@18.2.0)
+ classnames: 2.3.2
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.11.2(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@12.12.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-e10VBjEkECdPl4XZSs9to81SE+mgclBTM7J8/LMsFqmJoi05Tci91bRnmeeDtrcOCx2PuZdJv57XUlC4d8PEIw==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+ rc-menu: 9.12.2(react-dom@18.2.0)(react@18.2.0)
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-CiqK+uyoJlnfufbC0kwfHJpfElhQacuDSNyNQ/xGnA/QMaJLDbgmqRT8QmX0T0KD/ws/hy6qqRaGJSsrRR5uiQ==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-input: 1.2.1(react-dom@18.2.0)(react@18.2.0)
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.0.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ '@rc-component/trigger': 1.17.0(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.13.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-g01JU9EdE7j/9KfDKtmvFqJ7ZDNIYDzkpmAXllbTBFoRNhWJBjW1x/dCZLVG+IdZeIz8SKJkgZzCf1CUZrzV/Q==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-select: 14.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-tree: 5.7.12(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.7.12(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==}
+ engines: {node: '>=10.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.0(react-dom@18.2.0)(react@18.2.0)
+ rc-virtual-list: 3.11.2(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.3.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-util: 5.38.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.38.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-yV/YBNdFn+edyBpBdCqkPE29Su0jWcHNgwx2dJbRqMrMfrUcMJUjCRV+ZPhcvWyKFJ63GzEerPrz9JIVo0zXmA==}
+ peerDependencies:
+ react: '>=16.9.0'
+ react-dom: '>=16.9.0'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-is: 18.2.0
+ dev: false
+
+ /rc-virtual-list@3.11.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg==}
+ engines: {node: '>=8.x'}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@babel/runtime': 7.23.2
+ classnames: 2.3.2
+ rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+ rc-util: 5.38.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.23.2
+ 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.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.23.2
+ 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.23.2
+ 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.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ 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.6
+ '@types/prop-types': 15.7.8
+ '@types/react': 18.2.28
+ '@types/unist': 2.0.8
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 2.0.1
+ prop-types: 15.8.1
+ property-information: 6.3.0
+ react: 18.2.0
+ react-is: 18.2.0
+ remark-parse: 10.0.2
+ remark-rehype: 10.1.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.2
+ 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.11.2
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ 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.23.2
+ '@types/react-redux': 7.1.28
+ 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.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ 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.2):
+ resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
+ peerDependencies:
+ react: '*'
+ tslib: '*'
+ dependencies:
+ react: 18.2.0
+ tslib: 2.6.2
+ 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.3.5(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.2)
+ 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.2
+ 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.2
+ 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.2
+ 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.23.2
+ dev: false
+
+ /reflect.getprototypeof@1.0.4:
+ resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ get-intrinsic: 1.2.1
+ globalthis: 1.0.3
+ which-builtin-type: 1.1.3
+ 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.0:
+ resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
+
+ /regenerator-transform@0.15.2:
+ resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+ dependencies:
+ '@babel/runtime': 7.23.2
+ 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.1:
+ resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ set-function-name: 2.0.1
+
+ /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.6
+ 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.6
+ 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.13
+ 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.13
+ 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.6
+ '@types/mdast': 3.0.13
+ 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.2:
+ resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
+ dev: false
+
+ /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.13.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.13.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ 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.3.0:
+ resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+ dev: true
+
+ /rimraf@2.6.3:
+ resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ 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.23.2
+ dev: false
+
+ /run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ dependencies:
+ tslib: 2.6.2
+ 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.0.1:
+ resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ 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.0:
+ resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ 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
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /sass@1.69.3:
+ resolution: {integrity: sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.3.4
+ source-map-js: 1.0.2
+
+ /scheduler@0.23.0:
+ resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ 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
+
+ /set-cookie-parser@2.6.0:
+ resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
+ dev: true
+
+ /set-function-name@2.0.1:
+ resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.1
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.0
+
+ /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.4:
+ resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ object-inspect: 1.12.3
+ dev: true
+
+ /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.4:
+ resolution: {integrity: sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==}
+ dependencies:
+ '@types/lodash-es': 4.17.9
+ can-use-dom: 0.1.0
+ 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.4
+ 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.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ 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
+
+ /sourcemap-codec@1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ deprecated: Please use @jridgewell/sourcemap-codec instead
+ dev: false
+
+ /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.16
+ dev: true
+
+ /spdx-exceptions@2.3.0:
+ resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.3.0
+ spdx-license-ids: 3.0.16
+ dev: true
+
+ /spdx-license-ids@3.0.16:
+ resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==}
+ 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
+
+ /strict-event-emitter@0.2.8:
+ resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==}
+ dependencies:
+ events: 3.3.0
+ dev: true
+
+ /strict-event-emitter@0.4.6:
+ resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==}
+ 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.10:
+ resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ get-intrinsic: 1.2.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.5
+ regexp.prototype.flags: 1.5.1
+ set-function-name: 2.0.1
+ side-channel: 1.0.4
+ dev: true
+
+ /string.prototype.trim@1.2.8:
+ resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ dev: true
+
+ /string.prototype.trimend@1.0.7:
+ resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ dev: true
+
+ /string.prototype.trimstart@1.0.7:
+ resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.2.1
+ es-abstract: 1.22.2
+ 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
+
+ /style-search@0.1.0:
+ resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+ dev: true
+
+ /style-to-object@0.4.2:
+ resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==}
+ 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.23.0(@babel/core@7.23.2)
+ '@babel/core': 7.23.2
+ '@babel/helper-module-imports': 7.22.15
+ '@babel/plugin-external-helpers': 7.22.5(@babel/core@7.23.2)
+ '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2)
+ '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.2)
+ '@babel/preset-env': 7.23.2(@babel/core@7.23.2)
+ '@babel/preset-react': 7.22.15(@babel/core@7.23.2)
+ '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2)
+ '@babel/traverse': 7.23.2
+ '@emotion/is-prop-valid': 1.2.1
+ '@emotion/unitless': 0.8.1
+ '@types/stylis': 4.2.1
+ css-to-react-native: 3.2.0
+ csstype: 3.1.2
+ postcss: 8.4.31
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ shallowequal: 1.1.0
+ stylis: 4.3.0
+ tslib: 2.6.2
+ 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.3.2(@csstools/css-tokenizer@2.2.1)
+ '@csstools/css-tokenizer': 2.2.1
+ '@csstools/media-query-list-parser': 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1)
+ '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13)
+ balanced-match: 2.0.0
+ colord: 2.9.3
+ cosmiconfig: 8.3.6(typescript@5.2.2)
+ css-functions-list: 3.2.0
+ css-tree: 2.3.1
+ debug: 4.3.4
+ fast-glob: 3.3.1
+ 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.2.4
+ 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.5
+ normalize-path: 3.0.0
+ picocolors: 1.0.0
+ postcss: 8.4.31
+ postcss-resolve-nested-selector: 0.1.1
+ postcss-safe-parser: 6.0.0(postcss@8.4.31)
+ postcss-selector-parser: 6.0.13
+ 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.1
+ 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.4
+ 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.2.4
+ 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.1
+ 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.0:
+ resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==}
+ dev: false
+
+ /sucrase@3.34.0:
+ resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.3
+ commander: 4.1.1
+ glob: 7.1.6
+ 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
+
+ /superjson@1.13.3:
+ resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==}
+ engines: {node: '>=10'}
+ dependencies:
+ copy-anything: 3.0.5
+ dev: false
+
+ /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.0(postcss@5.2.18)
+ posthtml-rename-id: 1.0.12
+ posthtml-svg-mode: 1.0.3
+ query-string: 4.3.4
+ traverse: 0.6.7
+ 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.0
+ 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.1:
+ resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ ajv: 8.12.0
+ 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.5.3
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.1
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.20.0
+ lilconfig: 2.1.0
+ micromatch: 4.0.5
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.0.0
+ postcss: 8.4.31
+ postcss-import: 15.1.0(postcss@8.4.31)
+ postcss-js: 4.0.1(postcss@8.4.31)
+ postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.1)
+ postcss-nested: 6.0.1(postcss@8.4.31)
+ postcss-selector-parser: 6.0.13
+ resolve: 1.22.8
+ sucrase: 3.34.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.5
+ acorn: 8.10.0
+ 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.0:
+ resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==}
+ 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.1:
+ resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
+ dev: false
+
+ /tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: true
+
+ /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
+
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: true
+
+ /traverse@0.6.7:
+ resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==}
+ 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.1.0:
+ resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
+ 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.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.5.1
+ acorn: 8.10.0
+ acorn-walk: 8.2.0
+ 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@20.9.4)(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.9
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.9.4
+ acorn: 8.10.0
+ acorn-walk: 8.2.0
+ 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.14.2:
+ resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==}
+ 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.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+ /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@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /typed-array-buffer@1.0.0:
+ resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.2.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-byte-length@1.0.0:
+ resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-byte-offset@1.0.0:
+ resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ has-proto: 1.0.1
+ is-typed-array: 1.1.12
+ dev: true
+
+ /typed-array-length@1.0.4:
+ resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ dependencies:
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ is-typed-array: 1.1.12
+ dev: true
+
+ /types-ramda@0.29.5:
+ resolution: {integrity: sha512-u+bAYXHDPJR+amB0qMrMU/NXRB2PG8QqpO2v6j7yK/0mPZhlaaZj++ynYjnVpkPEpCkZEGxNpWY3X7qyLCGE3w==}
+ 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.2
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /undici-types@5.25.3:
+ resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==}
+ dev: true
+
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ /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.8
+ bail: 2.0.2
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 4.1.0
+ trough: 2.1.0
+ vfile: 5.3.7
+ dev: false
+
+ /unified@7.1.0:
+ resolution: {integrity: sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==}
+ dependencies:
+ '@types/unist': 2.0.8
+ '@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.8
+ 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.8
+ dev: false
+
+ /unist-util-position@4.0.4:
+ resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ dependencies:
+ '@types/unist': 2.0.8
+ 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.8
+ dev: false
+
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+ dependencies:
+ '@types/unist': 3.0.0
+ 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.8
+ 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.8
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+ dev: false
+
+ /universalify@2.0.0:
+ resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+ 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.0.13(browserslist@4.22.1):
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.22.1
+ escalade: 3.1.1
+ picocolors: 1.0.0
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.0
+ 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
+
+ /util@0.12.5:
+ resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+ dependencies:
+ inherits: 2.0.4
+ is-arguments: 1.1.1
+ is-generator-function: 1.0.10
+ is-typed-array: 1.1.12
+ which-typed-array: 1.1.11
+ dev: true
+
+ /uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.1.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.8
+ 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.8
+ 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.0
+ 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.8
+ 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.4
+ 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@20.9.4)(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.4
+ globrex: 0.1.2
+ tsconfck: 2.1.2(typescript@5.2.2)
+ vite: 4.4.11(@types/node@20.9.4)(sass@1.69.3)(terser@5.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /vite@4.4.11(@types/node@20.9.4)(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': 20.9.4
+ 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
+
+ /wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.4
+ dev: true
+
+ /web-encoding@1.1.5:
+ resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==}
+ dependencies:
+ util: 0.12.5
+ optionalDependencies:
+ '@zxing/text-encoding': 0.9.0
+ dev: true
+
+ /web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+ dev: false
+
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: true
+
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
+ /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.3:
+ resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function.prototype.name: 1.1.6
+ has-tostringtag: 1.0.0
+ is-async-function: 2.0.0
+ is-date-object: 1.0.5
+ is-finalizationregistry: 1.0.2
+ is-generator-function: 1.0.10
+ is-regex: 1.1.4
+ is-weakref: 1.0.2
+ isarray: 2.0.5
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.1
+ which-typed-array: 1.1.11
+ dev: true
+
+ /which-collection@1.0.1:
+ resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+ dependencies:
+ is-map: 2.0.2
+ is-set: 2.0.2
+ is-weakmap: 2.0.1
+ is-weakset: 2.0.2
+ dev: true
+
+ /which-typed-array@1.1.11:
+ resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.2
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.0
+ 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
+
+ /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.3.2:
+ resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==}
+ engines: {node: '>= 14'}
+ 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.1
+ 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
+
+ /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..51d85ee
--- /dev/null
+++ b/public/mockServiceWorker.js
@@ -0,0 +1,303 @@
+/* eslint-disable */
+/* tslint:disable */
+
+/**
+ * Mock Service Worker (1.3.2).
+ * @see https://github.com/mswjs/msw
+ * - Please do NOT modify this file.
+ * - Please do NOT serve this file on production.
+ */
+
+const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70'
+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: 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
+ const accept = request.headers.get('accept') || ''
+
+ // Bypass server-sent events.
+ if (accept.includes('text/event-stream')) {
+ return
+ }
+
+ // 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 = Math.random().toString(16).slice(2)
+
+ event.respondWith(
+ handleRequest(event, requestId).catch((error) => {
+ if (error.name === 'NetworkError') {
+ console.warn(
+ '[MSW] Successfully emulated a network error for the "%s %s" request.',
+ request.method,
+ request.url,
+ )
+ return
+ }
+
+ // At this point, any exception indicates an issue with the original request/response.
+ console.error(
+ `\
+[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`,
+ request.method,
+ request.url,
+ `${error.name}: ${error.message}`,
+ )
+ }),
+ )
+})
+
+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 clonedResponse = response.clone()
+ sendToClient(client, {
+ type: 'RESPONSE',
+ payload: {
+ requestId,
+ type: clonedResponse.type,
+ ok: clonedResponse.ok,
+ status: clonedResponse.status,
+ statusText: clonedResponse.statusText,
+ body:
+ clonedResponse.body === null ? null : await clonedResponse.text(),
+ headers: Object.fromEntries(clonedResponse.headers.entries()),
+ redirected: clonedResponse.redirected,
+ },
+ })
+ })()
+ }
+
+ 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
+ const clonedRequest = request.clone()
+
+ function passthrough() {
+ // Clone the request because it might've been already used
+ // (i.e. its body has been read and sent to the client).
+ const headers = Object.fromEntries(clonedRequest.headers.entries())
+
+ // Remove MSW-specific request headers so the bypassed requests
+ // comply with the server's CORS preflight check.
+ // Operate with the headers as an object because request "Headers"
+ // are immutable.
+ delete headers['x-msw-bypass']
+
+ return fetch(clonedRequest, { 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()
+ }
+
+ // Bypass requests with the explicit bypass header.
+ // Such requests can be issued by "ctx.fetch()".
+ if (request.headers.get('x-msw-bypass') === 'true') {
+ return passthrough()
+ }
+
+ // Notify the client that a request has been intercepted.
+ const clientMessage = await sendToClient(client, {
+ type: 'REQUEST',
+ payload: {
+ id: requestId,
+ url: request.url,
+ method: request.method,
+ headers: Object.fromEntries(request.headers.entries()),
+ cache: request.cache,
+ mode: request.mode,
+ credentials: request.credentials,
+ destination: request.destination,
+ integrity: request.integrity,
+ redirect: request.redirect,
+ referrer: request.referrer,
+ referrerPolicy: request.referrerPolicy,
+ body: await request.text(),
+ bodyUsed: request.bodyUsed,
+ keepalive: request.keepalive,
+ },
+ })
+
+ switch (clientMessage.type) {
+ case 'MOCK_RESPONSE': {
+ return respondWithMock(clientMessage.data)
+ }
+
+ case 'MOCK_NOT_FOUND': {
+ return passthrough()
+ }
+
+ case 'NETWORK_ERROR': {
+ const { name, message } = clientMessage.data
+ const networkError = new Error(message)
+ networkError.name = name
+
+ // Rejecting a "respondWith" promise emulates a network error.
+ throw networkError
+ }
+ }
+
+ return passthrough()
+}
+
+function sendToClient(client, message) {
+ 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])
+ })
+}
+
+function sleep(timeMs) {
+ return new Promise((resolve) => {
+ setTimeout(resolve, timeMs)
+ })
+}
+
+async function respondWithMock(response) {
+ await sleep(response.delay)
+ return new Response(response.body, response)
+}
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..38d5134
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,20 @@
+import { App as AntdApp } from 'antd';
+
+import Router from '@/router/index';
+import AntdConfig from '@/theme/antd';
+
+import { MotionLazy } from './components/animate/motion-lazy';
+
+function App() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/src/_mock/_org.js b/src/_mock/_org.js
new file mode 100644
index 0000000..fca05b3
--- /dev/null
+++ b/src/_mock/_org.js
@@ -0,0 +1,16 @@
+import { rest } from 'msw';
+
+import { ORG_LIST } from '@/_mock/assets';
+import { OrgApi } from '@/api/services/orgService';
+
+const orgList = rest.get(`/api${OrgApi.Org}`, (req, res, ctx) => {
+ return res(
+ ctx.json({
+ status: 0,
+ message: '',
+ data: ORG_LIST,
+ }),
+ );
+});
+
+export default [orgList];
diff --git a/src/_mock/_user.js b/src/_mock/_user.js
new file mode 100644
index 0000000..c5aaa44
--- /dev/null
+++ b/src/_mock/_user.js
@@ -0,0 +1,50 @@
+import { faker } from '@faker-js/faker';
+import { rest } from 'msw';
+
+import { UserApi } from '@/api/services/userService';
+
+import { USER_LIST } from './assets';
+
+const signIn = rest.post(`/api${UserApi.SignIn}`, async (req, res, ctx) => {
+ const { username, password } = await req.json();
+
+ const user = USER_LIST.find((item) => item.username === username);
+
+ if (!user || user.password !== password) {
+ return res(
+ ctx.json({
+ status: 10001,
+ message: 'Incorrect username or password.',
+ }),
+ );
+ }
+
+ return res(
+ ctx.json({
+ status: 0,
+ message: '',
+ data: {
+ user,
+ accessToken: faker.string.uuid(),
+ refreshToken: faker.string.uuid(),
+ },
+ }),
+ );
+});
+
+const userList = rest.get('/api/user', (req, res, ctx) => {
+ return res(
+ ctx.status(200),
+ ctx.delay(1000),
+ ctx.json(
+ Array.from({ length: 10 }).map(() => ({
+ fullname: faker.person.fullName(),
+ email: faker.internet.email(),
+ avatar: faker.image.avatar(),
+ address: faker.location.streetAddress(),
+ })),
+ ),
+ );
+});
+
+export default [signIn, userList];
diff --git a/src/_mock/assets.js b/src/_mock/assets.js
new file mode 100644
index 0000000..e740b4c
--- /dev/null
+++ b/src/_mock/assets.js
@@ -0,0 +1,522 @@
+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 },
+ ],
+ },
+ {
+ id: '3',
+ name: 'Northwest Branch',
+ status: 'enable',
+ desc: faker.lorem.words(),
+ order: 3,
+ children: [
+ { id: '3-1', name: 'R&D Department', status: 'disable', desc: '', order: 1 },
+ { id: '3-2', name: 'Marketing Department', status: 'enable', desc: '', order: 2 },
+ { id: '3-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',
+ },
+ ],
+ },
+ ],
+};
+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',
+ },
+ ],
+};
+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: '3981225257359246',
+ parentId: '',
+ label: 'sys.menu.calendar',
+ name: 'Calendar',
+ icon: 'solar:calendar-bold-duotone',
+ type: PermissionType.MENU,
+ route: 'calendar',
+ component: '/sys/others/calendar/index.tsx',
+ },
+ {
+ id: '3513985683886393',
+ parentId: '',
+ label: 'sys.menu.kanban',
+ name: 'kanban',
+ icon: 'solar:clipboard-bold-duotone',
+ type: PermissionType.MENU,
+ route: 'kanban',
+ component: '/sys/others/kanban/index.tsx',
+ },
+ {
+ id: '5455837930804461',
+ parentId: '',
+ label: 'sys.menu.disabled',
+ name: 'Disabled',
+ icon: 'ic_disabled',
+ type: PermissionType.MENU,
+ route: 'disabled',
+ status: BasicStatus.DISABLE,
+ component: '/sys/others/calendar/index.tsx',
+ },
+ {
+ id: '7728048658221587',
+ parentId: '',
+ label: 'sys.menu.label',
+ name: 'Label',
+ icon: 'ic_label',
+ type: PermissionType.MENU,
+ route: 'label',
+ newFeature: true,
+ component: '/sys/others/blank.tsx',
+ },
+ {
+ id: '5733704222120995',
+ parentId: '',
+ label: 'sys.menu.frame',
+ name: 'Frame',
+ icon: 'ic_external',
+ type: PermissionType.CATALOGUE,
+ route: 'frame',
+ children: [
+ {
+ id: '9884486809510480',
+ parentId: '5733704222120995',
+ label: 'sys.menu.external_link',
+ name: 'External Link',
+ type: PermissionType.MENU,
+ route: 'external_link',
+ component: '/sys/others/iframe/external-link.tsx',
+ frameSrc: 'https://ant.design/',
+ },
+ {
+ id: '9299640886731819',
+ parentId: '5733704222120995',
+ label: 'sys.menu.iframe',
+ name: 'Iframe',
+ type: PermissionType.MENU,
+ route: 'frame',
+ component: '/sys/others/iframe/index.tsx',
+ frameSrc: 'https://ant.design/',
+ },
+ ],
+ },
+ {
+ id: '0941594969900756',
+ parentId: '',
+ label: 'sys.menu.blank',
+ name: 'Disabled',
+ icon: 'ic_blank',
+ type: PermissionType.MENU,
+ route: 'blank',
+ component: '/sys/others/blank.tsx',
+ },
+];
+
+export const PERMISSION_LIST = [
+ DASHBOARD_PERMISSION,
+ MANAGEMENT_PERMISSION,
+ COMPONENTS_PERMISSION,
+ FUNCTIONS_PERMISSION,
+ MENU_LEVEL_PERMISSION,
+ ERRORS_PERMISSION,
+ ...OTHERS_PERMISSION,
+];
+
+/**
+ * User role mock
+ */
+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: faker.string.uuid(),
+ username: 'admin@gmail.com',
+ 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: faker.string.uuid(),
+ username: 'test@gmail.com',
+ 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/index.js b/src/_mock/index.js
new file mode 100644
index 0000000..01c1616
--- /dev/null
+++ b/src/_mock/index.js
@@ -0,0 +1,7 @@
+import { setupWorker } from 'msw';
+
+import orgMockApi from './_org';
+import userMockApi from './_user';
+
+export const handlers = [...userMockApi, ...orgMockApi];
+export const worker = setupWorker(...handlers);
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..0f29603
--- /dev/null
+++ b/src/api/apiClient.ts
@@ -0,0 +1,94 @@
+import { message as Message } from 'antd';
+import axios, { AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios';
+import { isEmpty } from 'ramda';
+
+import { t } from '@/locales/i18n';
+
+import { Result } from '#/api';
+import { ResultEnum } from '#/enum';
+
+// 创建 axios 实例
+const axiosInstance = axios.create({
+ baseURL: import.meta.env.VITE_APP_BASE_API as string,
+ timeout: 50000,
+ headers: { 'Content-Type': 'application/json;charset=utf-8' },
+});
+
+// 请求拦截
+axiosInstance.interceptors.request.use(
+ (config) => {
+ // 在请求被发送之前做些什么
+ config.headers.Authorization = 'Bearer Token';
+ return config;
+ },
+ (error) => {
+ // 请求错误时做些什么
+ return Promise.reject(error);
+ },
+);
+
+// 响应拦截
+axiosInstance.interceptors.response.use(
+ (res: AxiosResponse) => {
+ if (!res.data) throw new Error(t('sys.api.apiRequestFailed'));
+
+ const { status, data, message } = res.data;
+ // 业务请求成功
+ const hasSuccess = data && Reflect.has(res.data, 'status') && status === ResultEnum.SUCCESS;
+ if (hasSuccess) {
+ return data;
+ }
+
+ // 业务请求错误
+ throw new Error(message || t('sys.api.apiRequestFailed'));
+ },
+ (error: AxiosError) => {
+ const { response, message } = error || {};
+ let errMsg = '';
+ try {
+ errMsg = response?.data?.message || message;
+ } catch (error) {
+ throw new Error(error as unknown as string);
+ }
+ // 对响应错误做点什么
+ if (isEmpty(errMsg)) {
+ // checkStatus
+ // errMsg = checkStatus(response.data.status);
+ errMsg = t('sys.api.errorMessage');
+ }
+ Message.error(errMsg);
+ 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/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..59a037b
--- /dev/null
+++ b/src/api/services/userService.ts
@@ -0,0 +1,33 @@
+import apiClient from '../apiClient';
+
+import { UserInfo, UserToken } from '#/entity';
+
+export interface SignInReq {
+ username: string;
+ password: string;
+}
+
+export interface SignUpReq extends SignInReq {
+ email: string;
+}
+export type SignInRes = UserToken & { user: UserInfo };
+
+export enum UserApi {
+ SignIn = '/auth/signin',
+ SignUp = '/auth/signup',
+ Logout = '/auth/logout',
+ Refresh = '/auth/refresh',
+ User = '/user',
+}
+
+const signin = (data: SignInReq) => apiClient.post({ url: UserApi.SignIn, data });
+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/dashboard2.png b/src/assets/images/background/dashboard2.png
new file mode 100644
index 0000000..5f008e5
Binary files /dev/null and b/src/assets/images/background/dashboard2.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_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/react.svg b/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/vite.svg b/src/assets/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/src/assets/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/animate/motion-container.tsx b/src/components/animate/motion-container.tsx
new file mode 100644
index 0000000..e602413
--- /dev/null
+++ b/src/components/animate/motion-container.tsx
@@ -0,0 +1,40 @@
+import { m, MotionProps } from 'framer-motion';
+
+import { varContainer } from './variants/container';
+
+interface Props extends MotionProps {
+ className?: string;
+}
+
+/**
+ * Motion 通用容器
+ *
+ * variants: [变体可以用于使用单个动画道具为组件的整个子树设置动画](https://www.framer.com/motion/animation/#variants)
+ *
+ * Variants 是一组预定义的对象
+ * const variants = {
+ * visible: { opacity: 1 },
+ * hidden: { opacity: 0 },
+ * }
+ *
+ * 需要指定 inital 和 animate 属性名
+ *
+ */
+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..51c146b
--- /dev/null
+++ b/src/components/animate/motion-viewport.tsx
@@ -0,0 +1,28 @@
+import { MotionProps, m } from 'framer-motion';
+
+import { varContainer } from './variants';
+
+interface Props extends MotionProps {
+ className?: string;
+}
+/**
+ * [whileInView: 元素可以在进出视口时设置动画](https://www.framer.com/motion/scroll-animations/#scroll-triggered-animations)
+ *
+ * + viewport: [视口](https://www.framer.com/motion/scroll-animations/###viewport)
+ *
+ * + once: 仅触发一次
+ */
+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..241a764
--- /dev/null
+++ b/src/components/editor/styles.ts
@@ -0,0 +1,187 @@
+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)};
+ }
+ 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..f126692
--- /dev/null
+++ b/src/components/locale-picker/index.tsx
@@ -0,0 +1,38 @@
+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..5bdf9e6
--- /dev/null
+++ b/src/components/logo/index.tsx
@@ -0,0 +1,17 @@
+import { NavLink } from 'react-router-dom';
+
+import { useThemeToken } from '@/theme/hooks';
+
+function Logo({ className = '' }: { className?: string }) {
+ const { colorPrimary } = useThemeToken();
+
+ return (
+
+
+ Logo
+
+
+ );
+}
+
+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..7c59322
--- /dev/null
+++ b/src/components/upload/upload-list-item.tsx
@@ -0,0 +1,79 @@
+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(() => {
+ // TODO: mock upload sucess, you should delete 'error' in the production environment
+ if (['done', 'error'].includes(file.status!) && format === 'img') {
+ setImgThumbUrl(getBlobUrl(file.originFileObj!));
+ }
+ }, [file, format]);
+
+ const closeButton = (
+
+
+
+ );
+
+ const thumbList = (
+
+
+ {format === 'img' ? (
+
+ ) : (
+
+ )}
+
+ {closeButton}
+
+ );
+ const cardList = (
+
+ {format === 'img' ? (
+
+ ) : (
+
+ )}
+
+ {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..86a1ec3
--- /dev/null
+++ b/src/components/upload/upload.tsx
@@ -0,0 +1,51 @@
+import { Typography, Upload as AntdUpload } from 'antd';
+import { ItemRender } from 'antd/es/upload/interface';
+
+import { useThemeToken } from '@/theme/hooks';
+
+import { StyledUpload } from './styles';
+import UploadIllustration from './upload-illustration';
+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..b917cd2
--- /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/web/use-keepalive.ts b/src/hooks/web/use-keepalive.ts
new file mode 100644
index 0000000..481a811
--- /dev/null
+++ b/src/hooks/web/use-keepalive.ts
@@ -0,0 +1,135 @@
+import { useCallback, useEffect, useState } from 'react';
+
+import { useMatchRouteMeta, useRouter } from '@/router/hooks';
+
+import { RouteMeta } from '#/router';
+
+export type KeepAliveTab = RouteMeta & {
+ children: any;
+};
+export default function useKeepAlive() {
+ const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+ const { push } = useRouter();
+ // tabs
+ const [tabs, setTabs] = useState([]);
+
+ // active tab
+ const [activeTabRoutePath, setActiveTabRoutePath] = useState();
+
+ // current route meta
+ const currentRouteMeta = useMatchRouteMeta();
+
+ /**
+ * Close specified tab
+ */
+ const closeTab = useCallback(
+ (path = activeTabRoutePath) => {
+ if (tabs.length === 1) return;
+ const deleteTabIndex = tabs.findIndex((item) => item.key === path);
+ if (deleteTabIndex > 0) {
+ push(tabs[deleteTabIndex - 1].key);
+ } else {
+ push(tabs[deleteTabIndex + 1].key);
+ }
+
+ tabs.splice(deleteTabIndex, 1);
+ setTabs([...tabs]);
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [activeTabRoutePath],
+ );
+
+ /**
+ * Close other tabs besides the specified tab
+ */
+ const closeOthersTab = useCallback(
+ (path = activeTabRoutePath) => {
+ setTabs((prev) => prev.filter((item) => item.key === path));
+ },
+ [activeTabRoutePath],
+ );
+
+ /**
+ * Close all tabs then navigate to the home page
+ */
+ const closeAll = useCallback(() => {
+ // setTabs([tabHomePage]);
+ setTabs([]);
+ push(HOMEPAGE);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [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 = getKey();
+ }
+
+ return [...prev];
+ });
+ },
+ [activeTabRoutePath],
+ );
+
+ useEffect(() => {
+ if (!currentRouteMeta) return;
+ const existed = tabs.find((item) => item.key === currentRouteMeta.key);
+ if (!existed) {
+ setTabs((prev) => [
+ ...prev,
+ { ...currentRouteMeta, children: currentRouteMeta.outlet, timeStamp: getKey() },
+ ]);
+ }
+
+ setActiveTabRoutePath(currentRouteMeta.key);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [currentRouteMeta]);
+
+ return {
+ tabs,
+ activeTabRoutePath,
+ setTabs,
+ closeTab,
+ closeOthersTab,
+ refreshTab,
+ closeAll,
+ closeLeft,
+ closeRight,
+ };
+}
+
+function getKey() {
+ return new Date().getTime().toString();
+}
diff --git a/src/layouts/_common/account-dropdown.tsx b/src/layouts/_common/account-dropdown.tsx
new file mode 100644
index 0000000..e88dccb
--- /dev/null
+++ b/src/layouts/_common/account-dropdown.tsx
@@ -0,0 +1,84 @@
+import { Divider, MenuProps } from 'antd';
+import Dropdown, { DropdownProps } from 'antd/es/dropdown/dropdown';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { NavLink } from 'react-router-dom';
+
+import { IconButton } 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';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+/**
+ * Account Dropdown
+ */
+export default function AccountDropdown() {
+ const { replace } = useRouter();
+ const { username, email, avatar } = 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 } = 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.menu.dashboard')} , key: '0' },
+ {
+ label: {t('sys.menu.user.profile')} ,
+ key: '1',
+ },
+ {
+ label: {t('sys.menu.user.account')} ,
+ key: '2',
+ },
+ { type: 'divider' },
+ {
+ label: {t('sys.login.logout')} ,
+ key: '3',
+ 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..c0d8ab5
--- /dev/null
+++ b/src/layouts/_common/bread-crumb.tsx
@@ -0,0 +1,53 @@
+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 { useFlattenedRoutes, usePermissionRoutes } from '@/router/hooks';
+import { menuFilter } from '@/router/utils';
+
+import { AppRouteObject } from '#/router';
+
+/**
+ * 动态面包屑解决方案:https://github.com/MinjieChang/myblog/issues/29
+ */
+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..512cbfd
--- /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..fdc646d
--- /dev/null
+++ b/src/layouts/_common/notice.tsx
@@ -0,0 +1,269 @@
+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%',
+ };
+ const bodyStyle: CSSProperties = {
+ padding: 0,
+ };
+
+ return (
+
+
setDrawerOpen(true)}>
+
+
+
+
+
setDrawerOpen(false)}
+ open={drawerOpen}
+ closable={false}
+ width={420}
+ bodyStyle={bodyStyle}
+ maskStyle={{ 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
+ Slash Admin
+
+
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..53eaf86
--- /dev/null
+++ b/src/layouts/_common/search-bar.tsx
@@ -0,0 +1,248 @@
+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..."
+ bordered={false}
+ autoFocus
+ prefix={ }
+ suffix={
+
+ Esc
+
+ }
+ />
+ }
+ footer={
+
+ }
+ >
+ {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..b439948
--- /dev/null
+++ b/src/layouts/_common/setting-button.tsx
@@ -0,0 +1,404 @@
+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 bodyStyle: CSSProperties = {
+ padding: 0,
+ };
+
+ 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}
+ bodyStyle={bodyStyle}
+ maskStyle={{ 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 }}
+ bodyStyle={{
+ padding: 0,
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ }}
+ >
+
+
+
+
setThemeLayout(ThemeLayout.Horizontal)}
+ className="h-14 cursor-pointer"
+ style={{ flexGrow: 1, flexShrink: 0 }}
+ bodyStyle={{
+ 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 }}
+ bodyStyle={{
+ 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"
+ bodyStyle={{
+ 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..5ba9b7d
--- /dev/null
+++ b/src/layouts/dashboard/header.tsx
@@ -0,0 +1,99 @@
+import { Drawer } from 'antd';
+import Color from 'color';
+import { CSSProperties, useState } from 'react';
+
+import { IconButton, Iconify, SvgIcon } from '@/components/icon';
+import LocalePicker from '@/components/locale-picker';
+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 NoticeButton from '../_common/notice';
+import SearchBar from '../_common/search-bar';
+import SettingButton from '../_common/setting-button';
+
+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}
+
+
+
+
+
+
window.open('https://github.com/d3george/slash-admin')}>
+
+
+
+
+
+
+
+
+ setDrawerOpen(false)}
+ open={drawerOpen}
+ closeIcon={false}
+ headerStyle={{ display: 'none' }}
+ bodyStyle={{ 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..55d530a
--- /dev/null
+++ b/src/layouts/dashboard/index.tsx
@@ -0,0 +1,103 @@
+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 });
+ /**
+ * y轴是否滚动
+ */
+ 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 verticalLayout = (
+ <>
+
+
+
+
+
+ >
+ );
+
+ const horizontalLayout = (
+
+
+
+
+
+ );
+
+ const layout = themeLayout !== ThemeLayout.Horizontal ? verticalLayout : horizontalLayout;
+
+ return (
+
+
+
+
+ }>{layout}
+
+
+ );
+}
+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..f1b52c3
--- /dev/null
+++ b/src/layouts/dashboard/main.tsx
@@ -0,0 +1,49 @@
+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 { 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.tsx b/src/layouts/dashboard/multi-tabs.tsx
new file mode 100644
index 0000000..a2d32ae
--- /dev/null
+++ b/src/layouts/dashboard/multi-tabs.tsx
@@ -0,0 +1,419 @@
+import { Dropdown, MenuProps, Tabs, TabsProps } from 'antd';
+import Color from 'color';
+import { CSSProperties, 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 { Iconify } from '@/components/icon';
+import useKeepAlive, { KeepAliveTab } from '@/hooks/web/use-keepalive';
+import { useRouter } from '@/router/hooks';
+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 { 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,
+ } = useKeepAlive();
+
+ /**
+ * 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],
+ );
+
+ /**
+ * 当前显示dorpdown的tab
+ */
+ const onOpenChange = (open: boolean, tab: KeepAliveTab) => {
+ if (open) {
+ setopenDropdownTabKey(tab.key);
+ } else {
+ setopenDropdownTabKey('');
+ }
+ };
+
+ /**
+ * tab样式
+ */
+ 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],
+ );
+
+ /**
+ * 渲染单个tab
+ */
+ const renderTabLabel = useCallback(
+ (tab: KeepAliveTab) => {
+ return (
+ menuClick(menuInfo, tab) }}
+ onOpenChange={(open) => onOpenChange(open, tab)}
+ >
+ {
+ if (tab.key === activeTabRoutePath) return;
+ setHoveringTabKey(tab.key);
+ }}
+ onMouseLeave={() => setHoveringTabKey('')}
+ >
+
{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,
+ ],
+ );
+
+ /**
+ * 所有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 }) => {
+ // 拖拽到非法非 droppable区域
+ if (!destination) {
+ return;
+ }
+ // 原地放下
+ 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);
+ };
+
+ /**
+ * 渲染 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 renderTabBar: TabsProps['renderTabBar'] = () => {
+ return (
+
+
+
+ {(provided) => (
+
+
+ {tabs.map((tab, index) => (
+
push(tab.key)}
+ >
+
+ {(provided) => (
+
+ {renderTabLabel(tab)}
+
+ )}
+
+
+ ))}
+
+ {provided.placeholder}
+
+ )}
+
+
+
+ );
+ };
+
+ /**
+ * 路由变化时,滚动到指定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 监听wheel事件
+ */
+ 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; /* 隐藏滚动条 Firefox */
+ -ms-overflow-style: none; /* 隐藏滚动条 IE/Edge */
+ }
+
+ .hide-scrollbar::-webkit-scrollbar {
+ display: none; /* 隐藏滚动条 Chrome/Safari/Opera */
+ }
+`;
diff --git a/src/layouts/dashboard/nav-horizontal.tsx b/src/layouts/dashboard/nav-horizontal.tsx
new file mode 100644
index 0000000..b07a67a
--- /dev/null
+++ b/src/layouts/dashboard/nav-horizontal.tsx
@@ -0,0 +1,73 @@
+import { Menu, MenuProps } from 'antd';
+import { ItemType } from 'antd/es/menu/hooks/useItems';
+import { useState, useEffect, CSSProperties } from 'react';
+import { useNavigate, useMatches, useLocation } from 'react-router-dom';
+
+import { useRouteToMenuFn, usePermissionRoutes } 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();
+
+ /**
+ * state
+ */
+ const [openKeys, setOpenKeys] = useState([]);
+ const [selectedKeys, setSelectedKeys] = useState(['']);
+ const [menuList, setMenuList] = useState([]);
+
+ useEffect(() => {
+ setSelectedKeys([pathname]);
+ }, [pathname, matches]);
+
+ useEffect(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ const menus = routeToMenuFn(menuRoutes);
+ setMenuList(menus);
+ }, [permissionRoutes, routeToMenuFn]);
+
+ /**
+ * events
+ */
+ const onOpenChange: MenuProps['onOpenChange'] = (keys) => {
+ const latestOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
+ if (latestOpenKey) {
+ setOpenKeys(keys);
+ } else {
+ setOpenKeys([]);
+ }
+ };
+ const onClick: MenuProps['onClick'] = ({ key }) => {
+ 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..933bdce
--- /dev/null
+++ b/src/layouts/dashboard/nav.tsx
@@ -0,0 +1,153 @@
+import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons';
+import { Menu, MenuProps } from 'antd';
+import { ItemType } from 'antd/es/menu/hooks/useItems';
+import Color from 'color';
+import { CSSProperties, useEffect, useState } from 'react';
+import { useLocation, useMatches, useNavigate } from 'react-router-dom';
+
+import Logo from '@/components/logo';
+import Scrollbar from '@/components/scrollbar';
+import { useRouteToMenuFn, usePermissionRoutes } 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';
+
+type Props = {
+ closeSideBarDrawer?: () => void;
+};
+export default function Nav(props: Props) {
+ const navigate = useNavigate();
+ const matches = useMatches();
+ const { pathname } = useLocation();
+
+ const { colorTextBase, colorBgElevated, colorBorder } = useThemeToken();
+
+ const settings = useSettings();
+ const { themeLayout } = settings;
+ const { setSettings } = useSettingActions();
+
+ const menuStyle: CSSProperties = {
+ background: colorBgElevated,
+ };
+
+ const routeToMenuFn = useRouteToMenuFn();
+ const permissionRoutes = usePermissionRoutes();
+
+ /**
+ * state
+ */
+ const [collapsed, setCollapsed] = useState(false);
+ const [openKeys, setOpenKeys] = useState([]);
+ const [selectedKeys, setSelectedKeys] = useState(['']);
+ const [menuList, setMenuList] = useState([]);
+ const [menuMode, setMenuMode] = useState('inline');
+
+ useEffect(() => {
+ if (themeLayout === ThemeLayout.Vertical) {
+ const openKeys = matches
+ .filter((match) => match.pathname !== '/')
+ .map((match) => match.pathname);
+ setOpenKeys(openKeys);
+ }
+ setSelectedKeys([pathname]);
+ }, [pathname, matches, collapsed, themeLayout]);
+
+ useEffect(() => {
+ const menuRoutes = menuFilter(permissionRoutes);
+ const menus = routeToMenuFn(menuRoutes);
+ setMenuList(menus);
+ }, [permissionRoutes, routeToMenuFn]);
+
+ useEffect(() => {
+ if (themeLayout === ThemeLayout.Vertical) {
+ setCollapsed(false);
+ setMenuMode('inline');
+ }
+ if (themeLayout === ThemeLayout.Mini) {
+ setCollapsed(true);
+ setMenuMode('inline');
+ }
+ }, [themeLayout]);
+
+ /**
+ * events
+ */
+ const onOpenChange: MenuProps['onOpenChange'] = (keys) => {
+ const latestOpenKey = keys.find((key) => openKeys.indexOf(key) === -1);
+ if (latestOpenKey) {
+ setOpenKeys(keys);
+ } else {
+ setOpenKeys([]);
+ }
+ };
+ const onClick: MenuProps['onClick'] = ({ key }) => {
+ 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 ? (
+
+ ) : (
+
+ )}
+
+ {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..3ea8b06
--- /dev/null
+++ b/src/locales/i18n.ts
@@ -0,0 +1,35 @@
+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 zh_CN from './lang/zh_CN';
+
+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 },
+ zh_CN: { translation: zh_CN },
+ },
+ });
+
+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..acd126f
--- /dev/null
+++ b/src/locales/lang/en_US/sys.json
@@ -0,0 +1,143 @@
+{
+ "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": "Backstage management system",
+ "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"
+ },
+ "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",
+ "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",
+ "error": {
+ "index": "Error Page",
+ "403": "403",
+ "404": "404",
+ "500": "500"
+ }
+ }
+ }
+}
diff --git a/src/locales/lang/zh_CN/common.json b/src/locales/lang/zh_CN/common.json
new file mode 100644
index 0000000..40f268f
--- /dev/null
+++ b/src/locales/lang/zh_CN/common.json
@@ -0,0 +1,22 @@
+{
+ "common": {
+ "okText": "确认",
+ "closeText": "关闭",
+ "cancelText": "取消",
+ "loadingText": "加载中...",
+ "saveText": "保存",
+ "delText": "删除",
+ "resetText": "重置",
+ "searchText": "搜索",
+ "queryText": "查询",
+
+ "inputText": "请输入",
+ "chooseText": "请选择",
+
+ "redo": "刷新",
+ "back": "返回",
+
+ "light": "亮色主题",
+ "dark": "黑暗主题"
+ }
+}
diff --git a/src/locales/lang/zh_CN/index.ts b/src/locales/lang/zh_CN/index.ts
new file mode 100644
index 0000000..ebc57c5
--- /dev/null
+++ b/src/locales/lang/zh_CN/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/zh_CN/sys.json b/src/locales/lang/zh_CN/sys.json
new file mode 100644
index 0000000..63ba35b
--- /dev/null
+++ b/src/locales/lang/zh_CN/sys.json
@@ -0,0 +1,142 @@
+{
+ "sys": {
+ "api": {
+ "operationSuccess": "操作成功",
+ "operationFailed": "操作失败",
+ "errorTip": "错误提示",
+ "successTip": "成功提示",
+ "errorMessage": "操作失败,系统异常!",
+ "timeoutMessage": "登录超时,请重新登录!",
+ "apiTimeoutMessage": "接口请求超时,请刷新页面重试!",
+ "apiRequestFailed": "请求出错,请稍候重试",
+ "networkException": "网络异常",
+ "networkExceptionMsg": "网络异常,请检查您的网络连接是否正常!",
+
+ "errMsg401": "用户没有权限(令牌、用户名、密码错误)!",
+ "errMsg403": "用户得到授权,但是访问是被禁止的。!",
+ "errMsg404": "网络请求错误,未找到该资源!",
+ "errMsg405": "网络请求错误,请求方法未允许!",
+ "errMsg408": "网络请求超时!",
+ "errMsg500": "服务器错误,请联系管理员!",
+ "errMsg501": "网络未实现!",
+ "errMsg502": "网络错误!",
+ "errMsg503": "服务不可用,服务器暂时过载或维护!",
+ "errMsg504": "网络超时!",
+ "errMsg505": "http版本不支持该请求!"
+ },
+ "login": {
+ "backSignIn": "返回",
+ "signInFormTitle": "登录",
+ "mobileSignInFormTitle": "手机登录",
+ "qrSignInFormTitle": "二维码登录",
+ "signUpFormTitle": "注册",
+ "forgetFormTitle": "重置密码",
+
+ "signInPrimaryTitle": "欢迎回来",
+ "signInSecondTitle": "开箱即用的中后台管理系统",
+ "signInDesc": "输入您的个人详细信息开始使用!",
+ "policy": "我同意xxx隐私政策",
+ "scanSign": "扫码后点击'确认',即可完成登录",
+ "forgetFormSecondTitle": "请输入与您的帐户关联的电子邮件地址,我们将通过电子邮件向您发送重置密码的链接。",
+
+ "loginButton": "登录",
+ "registerButton": "注册",
+ "rememberMe": "记住我",
+ "forgetPassword": "忘记密码?",
+ "otherSignIn": "其他登录方式",
+ "sendSmsButton": "发送验证码",
+ "sendSmsText": "{{second}}秒后重新获取",
+ "sendEmailButton": "发送邮件",
+
+ "loginSuccessTitle": "登录成功",
+ "loginSuccessDesc": "欢迎回来",
+
+ "accountPlaceholder": "请输入账号",
+ "passwordPlaceholder": "请输入密码",
+ "confirmPasswordPlaceholder": "请输入确认密码",
+ "emaildPlaceholder": "请输入邮箱",
+ "smsPlaceholder": "请输入验证码",
+ "mobilePlaceholder": "请输入手机号码",
+ "policyPlaceholder": "勾选后才能注册",
+ "diffPwd": "两次输入密码不一致",
+
+ "userName": "账号",
+ "password": "密码",
+ "confirmPassword": "确认密码",
+ "email": "邮箱",
+ "smsCode": "短信验证码",
+ "mobile": "手机号码",
+
+ "registerAndAgree": "注册即我同意",
+ "termsOfService": " 服务条款 ",
+ "privacyPolicy": " 隐私政策 ",
+ "logout": "退出"
+ },
+ "tab": {
+ "fullscreen": "内容全屏",
+ "refresh": "刷新",
+ "close": "关闭标签页",
+ "closeOthers": "关闭其它标签页",
+ "closeAll": "关闭所有标签页",
+ "closeLeft": "关闭左侧标签页",
+ "closeRight": "关闭右侧标签页"
+ },
+ "menu": {
+ "dashboard": "仪表",
+ "workbench": "工作台",
+ "analysis": "分析",
+ "management": "管理",
+ "user": {
+ "index": "用户",
+ "profile": "个人资料",
+ "account": "账户"
+ },
+ "system": {
+ "index": "系统",
+ "organization": "组织",
+ "permission": "权限",
+ "role": "角色",
+ "user": "用户"
+ },
+ "blog": "博客",
+ "components": "组件",
+ "icon": "图标",
+ "animate": "动画",
+ "scroll": "滚动",
+ "markdown": "Markdown",
+ "editor": "富文本",
+ "i18n": "多语言",
+ "upload": "上传",
+ "chart": "图表",
+ "functions": "功能",
+ "clipboard": "剪贴板",
+ "menulevel": {
+ "index": "多级菜单",
+ "1a": "多级菜单 1a",
+ "1b": {
+ "index": "多级菜单 1b",
+ "2a": "多级菜单 2a",
+ "2b": {
+ "index": "多级菜单 2b",
+ "3a": "多级菜单 3a",
+ "3b": "多级菜单 3b"
+ }
+ }
+ },
+ "disabled": "项目禁用",
+ "label": "项目标签",
+ "frame": "项目外部链接",
+ "external_link": "外链",
+ "iframe": "内嵌",
+ "blank": "空白",
+ "calendar": "日历",
+ "kanban": "看板",
+ "error": {
+ "index": "异常页",
+ "403": "403",
+ "404": "404",
+ "500": "500"
+ }
+ }
+ }
+}
diff --git a/src/locales/useLocale.ts b/src/locales/useLocale.ts
new file mode 100644
index 0000000..8abbbf2
--- /dev/null
+++ b/src/locales/useLocale.ts
@@ -0,0 +1,50 @@
+import en_US from 'antd/locale/en_US';
+import zh_CN from 'antd/locale/zh_CN';
+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..897b089
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,58 @@
+// react-query
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
+// 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 charAt = `
+ ███████╗██╗ █████╗ ███████╗██╗ ██╗
+ ██╔════╝██║ ██╔══██╗██╔════╝██║ ██║
+ ███████╗██║ ███████║███████╗███████║
+ ╚════██║██║ ██╔══██║╚════██║██╔══██║
+ ███████║███████╗██║ ██║███████║██║ ██║
+ ╚══════╝╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
+ `;
+console.info(`%c${charAt}`, 'color: #5BE49B');
+
+// 创建一个 client
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: 3, // 失败重试次数
+ cacheTime: 300_000, // 缓存有效期 5m
+ staleTime: 10_1000, // 数据变得 "陈旧"(stale)的时间 10s
+ 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/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..1c6ce52
--- /dev/null
+++ b/src/pages/components/animate/views/background/container.tsx
@@ -0,0 +1,35 @@
+import { m } from 'framer-motion';
+import { useEffect, 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');
+
+ useEffect(() => {
+ console.log(varients);
+ });
+ 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')
+);
+\`\`\`
+
+
+
+![cover](https://res.cloudinary.com/trinhmai/image/upload/v1660897321/_minimal_mock/_Cover/cover_19.jpg)
+
+> 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..634da2a
--- /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..9791bfe
--- /dev/null
+++ b/src/pages/components/upload/index.tsx
@@ -0,0 +1,65 @@
+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..84c6a61
--- /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..c2804dd
--- /dev/null
+++ b/src/pages/dashboard/workbench/banner-card.tsx
@@ -0,0 +1,255 @@
+import { Col, Row } from 'antd';
+import Color from 'color';
+
+import Character3 from '@/assets/images/characters/character_3.png';
+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}
+
+
+ If you are going to use a passage of Lorem Ipsum, you need to be sure there is not
+ anything.
+
+
+ Go Now
+
+
+
+
+
+
+
+ );
+}
+
+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..deb3e6c
--- /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..c4bf84d
--- /dev/null
+++ b/src/pages/dashboard/workbench/top-authors.tsx
@@ -0,0 +1,67 @@
+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, precision: 3 })}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/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..3b9f777
--- /dev/null
+++ b/src/pages/management/system/permission/index.tsx
@@ -0,0 +1,141 @@
+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) => {
+ 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) => (
+
+
onEdit(record)}>
+
+
+
+
+
+
+
+
+ ),
+ },
+ ];
+
+ const onCreate = () => {
+ setPermissionModalProps((prev) => ({
+ ...prev,
+ show: true,
+ ...defaultPermissionValue,
+ }));
+ };
+
+ const onEdit = (formValue: Permission) => {
+ setPermissionModalProps((prev) => ({
+ ...prev,
+ show: true,
+ title: 'Edit',
+ formValue,
+ }));
+ };
+ return (
+
+ 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..5e1be16
--- /dev/null
+++ b/src/pages/management/system/permission/permission-modal.tsx
@@ -0,0 +1,107 @@
+import { Form, Modal, Input, InputNumber, Radio, TreeSelect } from 'antd';
+import { useEffect } from 'react';
+
+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();
+
+ useEffect(() => {
+ form.setFieldsValue({ ...formValue });
+ }, [formValue, form]);
+
+ 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>
+
+
+
+ label="Route" name="route" required>
+
+
+
+
+ label="Component"
+ name="component"
+ required={formValue.type === PermissionType.MENU}
+ >
+
+
+
+ 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/index.tsx b/src/pages/management/system/user/index.tsx
new file mode 100644
index 0000000..e1997e8
--- /dev/null
+++ b/src/pages/management/system/user/index.tsx
@@ -0,0 +1,94 @@
+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 ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+import { Role, UserInfo } from '#/entity';
+import { BasicStatus } from '#/enum';
+
+const USERS: UserInfo[] = USER_LIST;
+
+export default function RolePage() {
+ const { colorTextSecondary } = useThemeToken();
+ 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: () => (
+
+ ),
+ },
+ ];
+
+ const onCreate = () => {};
+
+ 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..2e13f3b
--- /dev/null
+++ b/src/pages/sys/error/Page403.tsx
@@ -0,0 +1,129 @@
+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';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+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..273ef63
--- /dev/null
+++ b/src/pages/sys/error/Page404.tsx
@@ -0,0 +1,120 @@
+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';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+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..7e58ebe
--- /dev/null
+++ b/src/pages/sys/error/Page500.tsx
@@ -0,0 +1,161 @@
+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';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+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/login/Login.tsx b/src/pages/sys/login/Login.tsx
new file mode 100644
index 0000000..236e547
--- /dev/null
+++ b/src/pages/sys/login/Login.tsx
@@ -0,0 +1,66 @@
+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 LocalePicker from '@/components/locale-picker';
+import { useUserToken } from '@/store/userStore';
+import { useThemeToken } from '@/theme/hooks';
+
+import LoginForm from './LoginForm';
+import MobileForm from './MobileForm';
+import { LoginStateProvider } from './providers/LoginStateProvider';
+import QrCodeFrom from './QrCodeForm';
+import RegisterForm from './RegisterForm';
+import ResetForm from './ResetForm';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+function Login() {
+ const { t } = useTranslation();
+ const token = useUserToken();
+ const { colorBgElevated } = useThemeToken();
+
+ // 判断用户是否有权限
+ if (token.accessToken) {
+ // 如果有授权,则跳转到首页
+ return ;
+ }
+
+ const gradientBg = Color(colorBgElevated).alpha(0.9).toString();
+ const bg = `linear-gradient(${gradientBg}, ${gradientBg}) center center / cover no-repeat,url(${Overlay2})`;
+
+ return (
+
+
+
Slash 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..914f9e4
--- /dev/null
+++ b/src/pages/sys/login/LoginForm.tsx
@@ -0,0 +1,140 @@
+import { Alert, Button, Checkbox, Col, Divider, Form, Input, Row } from 'antd';
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { AiFillGithub, AiFillGoogleCircle, AiFillWechat } from 'react-icons/ai';
+
+import { DEFAULT_USER, TEST_USER } from '@/_mock/assets';
+import { SignInReq } from '@/api/services/userService';
+import { useSignIn } from '@/store/userStore';
+import ProTag from '@/theme/antd/components/tag';
+import { useThemeToken } from '@/theme/hooks';
+
+import { LoginStateEnum, useLoginStateContext } from './providers/LoginStateProvider';
+
+function LoginForm() {
+ const { t } = useTranslation();
+ const themeToken = useThemeToken();
+ const [loading, setLoading] = useState(false);
+
+ const { loginState, setLoginState } = 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')}
+
+
+
+ {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..f82c46a
--- /dev/null
+++ b/src/pages/sys/login/MobileForm.tsx
@@ -0,0 +1,91 @@
+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 = () => {
+ // TODO: 发送验证码请求
+
+ // 启动倒计时
+ 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..8d953d4
--- /dev/null
+++ b/src/pages/sys/login/RegisterForm.tsx
@@ -0,0 +1,84 @@
+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(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..053a0f7
--- /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 { ModalFooterRender } from 'antd/es/modal/interface';
+import { Dayjs } from 'dayjs';
+import { useEffect } from 'react';
+
+import { IconButton, Iconify } from '@/components/icon';
+
+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(() => {
+ // 当 initValues 改变时,手动更新表单的值
+ const { color = COLORS[0], ...others } = initValues;
+ form.setFieldsValue({ ...others, color });
+ }, [initValues, form]);
+
+ // eslint-disable-next-line react/function-component-definition, react/no-unstable-nested-components
+ const ModalFooter: ModalFooterRender = (_, { 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..ed9e21b
--- /dev/null
+++ b/src/pages/sys/others/calendar/index.tsx
@@ -0,0 +1,214 @@
+import { faker } from '@faker-js/faker';
+import { DateSelectArg, EventClickArg, EventInput } from '@fullcalendar/core';
+// fullcalendar plugins
+import dayGridPlugin from '@fullcalendar/daygrid'; // 提供 dayGridMonth, dayGridWeek, dayGridDay, dayGrid 视图
+import interactionPlugin from '@fullcalendar/interaction'; // 如果需要 click select drag 这些action 则需要该依赖
+import listPlugin from '@fullcalendar/list'; // 提供 listWeek view
+import FullCalendar from '@fullcalendar/react';
+import timeGridPlugin from '@fullcalendar/timegrid'; // 提供 timeGridWeek, timeGridDay, 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..d574f0f
--- /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; /* 适用于Internet Explorer, Edge */
+ scrollbar-width: none; /* 适用于Firefox */
+ overflow-y: scroll;
+ &::-webkit-scrollbar {
+ display: none; /* 适用于Chrome、Safari和Opera */
+ }
+ .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..ce38000
--- /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..7b66f34
--- /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;
+ // 拖拽到非法非 droppable区域
+ if (!destination) {
+ return;
+ }
+ // 原地放下
+ 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..3b1a50a
--- /dev/null
+++ b/src/pages/sys/others/kanban/kanban-task.tsx
@@ -0,0 +1,174 @@
+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 bodyStyle: CSSProperties = {
+ padding: 0,
+ };
+
+ 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}
+ bodyStyle={bodyStyle}
+ maskStyle={{ backgroundColor: 'transparent' }}
+ style={style}
+ >
+
+
+ >
+ );
+}
+
+// 在这里使用memo很重要,因为drag column时,不应该重复渲染内部的task
+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..97a8b96
--- /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/router/components/auth-guard.tsx b/src/router/components/auth-guard.tsx
new file mode 100644
index 0000000..1f01a4c
--- /dev/null
+++ b/src/router/components/auth-guard.tsx
@@ -0,0 +1,25 @@
+import { useCallback, useEffect } from 'react';
+
+import { useUserToken } from '@/store/userStore';
+
+import { useRouter } from '../hooks';
+
+type Props = {
+ children: React.ReactNode;
+};
+export default function AuthGuard({ children }: Props) {
+ const router = useRouter();
+ const { 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..94a4ff5
--- /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 { useMatchRouteMeta } from './use-match-route-meta';
+export { useFlattenedRoutes } from './use-flattened-routes';
diff --git a/src/router/hooks/use-flattened-routes.ts b/src/router/hooks/use-flattened-routes.ts
new file mode 100644
index 0000000..6c9a95b
--- /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-match-route-meta.tsx b/src/router/hooks/use-match-route-meta.tsx
new file mode 100644
index 0000000..1f1c255
--- /dev/null
+++ b/src/router/hooks/use-match-route-meta.tsx
@@ -0,0 +1,48 @@
+import { useEffect, useState } from 'react';
+import { useMatches, useOutlet } from 'react-router-dom';
+
+import { useFlattenedRoutes } from './use-flattened-routes';
+import { useRouter } from './use-router';
+
+import { RouteMeta } from '#/router';
+
+/**
+ * 返回当前路由Meta信息
+ */
+export function useMatchRouteMeta() {
+ const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+ const [matchRouteMeta, setMatchRouteMeta] = useState();
+
+ // 获取路由组件实例
+ const children = useOutlet();
+
+ // 获取所有匹配的路由
+ const matchs = useMatches();
+
+ // 获取拍平后的路由菜单
+ const flattenedRoutes = useFlattenedRoutes();
+
+ // const pathname = usePathname();
+ const { push } = useRouter();
+
+ useEffect(() => {
+ // 获取当前匹配的路由
+ console.log('matchs1', matchs, flattenedRoutes);
+ const lastRoute = matchs.at(-1);
+
+ const currentRouteMeta = flattenedRoutes.find(
+ (item) => item.key === lastRoute?.pathname || `${item.key}/` === lastRoute?.pathname,
+ );
+ if (currentRouteMeta) {
+ if (!currentRouteMeta.hideTab) {
+ currentRouteMeta.outlet = children;
+ setMatchRouteMeta(currentRouteMeta);
+ }
+ } else {
+ push(HOMEPAGE);
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [matchs]);
+
+ return matchRouteMeta;
+}
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..ef21340
--- /dev/null
+++ b/src/router/hooks/use-permission-routes.tsx
@@ -0,0 +1,129 @@
+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';
+
+// 使用 import.meta.glob 获取所有路由组件
+const pages = import.meta.glob('/src/pages/**/*.tsx');
+
+// 构建绝对路径的函数
+function resolveComponent(path: string) {
+ return pages[`/src/pages${path}`];
+}
+
+/**
+ * return routes about permission
+ */
+export function usePermissionRoutes() {
+ 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,
+ status,
+ frameSrc,
+ newFeature,
+ component,
+ parentId,
+ children = [],
+ } = permission;
+
+ const appRoute: AppRouteObject = {
+ path: route,
+ meta: {
+ label,
+ key: getCompleteRoute(permission, flattenedPermissions),
+ hideMenu: !!hide,
+ 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..840d032
--- /dev/null
+++ b/src/router/hooks/use-route-to-menu.tsx
@@ -0,0 +1,59 @@
+import { ItemType } from 'antd/es/menu/hooks/useItems';
+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';
+
+/**
+ * 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..d4aeaa6
--- /dev/null
+++ b/src/router/index.tsx
@@ -0,0 +1,37 @@
+import { lazy } from 'react';
+import { Navigate, RouteObject, RouterProvider, createHashRouter } 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 { AppRouteObject } from '#/router';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+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[]);
+ 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..fa9126e
--- /dev/null
+++ b/src/router/routes/menu-routes.tsx
@@ -0,0 +1,25 @@
+import { Navigate } from 'react-router-dom';
+
+import DashboardLayout from '@/layouts/dashboard';
+
+import AuthGuard from '../components/auth-guard';
+import { getMenuModules } from '../utils';
+
+import { AppRouteObject } from '#/router';
+
+const menuModuleRoutes = getMenuModules();
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+/**
+ * dynamic routes
+ */
+export const menuRoutes: AppRouteObject = {
+ path: '/',
+ element: (
+
+
+
+ ),
+ children: [{ index: true, element: }, ...menuModuleRoutes],
+};
diff --git a/src/router/routes/modules/components.tsx b/src/router/routes/modules/components.tsx
new file mode 100644
index 0000000..eed4e84
--- /dev/null
+++ b/src/router/routes/modules/components.tsx
@@ -0,0 +1,79 @@
+import { Suspense, lazy } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { Iconify } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const AnimatePage = lazy(() => import('@/pages/components/animate'));
+const ScrollPage = lazy(() => import('@/pages/components/scroll'));
+const MarkdownPage = lazy(() => import('@/pages/components/markdown'));
+const EditorPage = lazy(() => import('@/pages/components/editor'));
+const MultiLanguagePage = lazy(() => import('@/pages/components/multi-language'));
+const IconPage = lazy(() => import('@/pages/components/icon'));
+const UploadPage = lazy(() => import('@/pages/components/upload'));
+const ChartPage = lazy(() => import('@/pages/components/chart'));
+
+const components: AppRouteObject = {
+ order: 3,
+ path: 'components',
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.components',
+ icon: ,
+ key: '/components',
+ },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'icon',
+ element: ,
+ meta: { label: 'sys.menu.icon', key: '/components/icon' },
+ },
+ {
+ path: 'animate',
+ element: ,
+ meta: { label: 'sys.menu.animate', key: '/components/animate' },
+ },
+ {
+ path: 'scroll',
+ element: ,
+ meta: { label: 'sys.menu.scroll', key: '/components/scroll' },
+ },
+ {
+ path: 'markdown',
+ element: ,
+ meta: { label: 'sys.menu.markdown', key: '/components/markdown' },
+ },
+ {
+ path: 'editor',
+ element: ,
+ meta: { label: 'sys.menu.editor', key: '/components/editor' },
+ },
+ {
+ path: 'i18n',
+ element: ,
+ meta: { label: 'sys.menu.i18n', key: '/components/i18n' },
+ },
+ {
+ path: 'upload',
+ element: ,
+ meta: { label: 'sys.menu.upload', key: '/components/upload' },
+ },
+ {
+ path: 'chart',
+ element: ,
+ meta: { label: 'sys.menu.chart', key: '/components/chart' },
+ },
+ ],
+};
+
+export default components;
diff --git a/src/router/routes/modules/dashboard.tsx b/src/router/routes/modules/dashboard.tsx
new file mode 100644
index 0000000..f56afea
--- /dev/null
+++ b/src/router/routes/modules/dashboard.tsx
@@ -0,0 +1,43 @@
+import { Suspense, lazy } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { SvgIcon } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const HomePage = lazy(() => import(`@/pages/dashboard/workbench`));
+const Analysis = lazy(() => import('@/pages/dashboard/analysis'));
+
+const dashboard: AppRouteObject = {
+ order: 1,
+ path: 'dashboard',
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.dashboard',
+ icon: ,
+ key: '/dashboard',
+ },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'workbench',
+ element: ,
+ meta: { label: 'sys.menu.workbench', key: '/dashboard/workbench' },
+ },
+ {
+ path: 'analysis',
+ element: ,
+ meta: { label: 'sys.menu.analysis', key: '/dashboard/analysis' },
+ },
+ ],
+};
+
+export default dashboard;
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/functions.tsx b/src/router/routes/modules/functions.tsx
new file mode 100644
index 0000000..2981287
--- /dev/null
+++ b/src/router/routes/modules/functions.tsx
@@ -0,0 +1,37 @@
+import { Suspense, lazy } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { Iconify } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const ClipboardPage = lazy(() => import('@/pages/functions/clipboard'));
+
+const functions: AppRouteObject = {
+ order: 4,
+ path: 'functions',
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.functions',
+ icon: ,
+ key: '/functions',
+ },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'clipboard',
+ element: ,
+ meta: { label: 'sys.menu.clipboard', key: '/functions/clipboard' },
+ },
+ ],
+};
+
+export default functions;
diff --git a/src/router/routes/modules/management.tsx b/src/router/routes/modules/management.tsx
new file mode 100644
index 0000000..f6259af
--- /dev/null
+++ b/src/router/routes/modules/management.tsx
@@ -0,0 +1,79 @@
+import { Suspense, lazy } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { SvgIcon } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+const ProfilePage = lazy(() => import('@/pages/management/user/profile'));
+const AccountPage = lazy(() => import('@/pages/management/user/account'));
+
+const OrganizationPage = lazy(() => import('@/pages/management/system/organization'));
+const PermissioPage = lazy(() => import('@/pages/management/system/permission'));
+
+const Blog = lazy(() => import('@/pages/management/blog'));
+
+const management: AppRouteObject = {
+ order: 2,
+ path: 'management',
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.management',
+ icon: ,
+ key: '/management',
+ },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'user',
+ meta: { label: 'sys.menu.user.index', key: '/management/user' },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'profile',
+ element: ,
+ meta: { label: 'sys.menu.user.profile', key: '/management/user/profile' },
+ },
+ {
+ path: 'account',
+ element: ,
+ meta: { label: 'sys.menu.user.account', key: '/management/user/account' },
+ },
+ ],
+ },
+ {
+ path: 'system',
+ meta: { label: 'sys.menu.system.index', key: '/management/system' },
+ children: [
+ {
+ path: 'organization',
+ element: ,
+ meta: { label: 'sys.menu.system.organization', key: '/management/system/organization' },
+ },
+ {
+ path: 'permission',
+ element: ,
+ meta: { label: 'sys.menu.system.permission', key: '/management/system/permission' },
+ },
+ ],
+ },
+ {
+ path: 'blog',
+ element: ,
+ meta: { label: 'sys.menu.blog', key: '/management/blog' },
+ },
+ ],
+};
+
+export default management;
diff --git a/src/router/routes/modules/menulevel.tsx b/src/router/routes/modules/menulevel.tsx
new file mode 100644
index 0000000..2f2232b
--- /dev/null
+++ b/src/router/routes/modules/menulevel.tsx
@@ -0,0 +1,83 @@
+import { Typography } from 'antd';
+import { Suspense } from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+
+import { SvgIcon } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+
+import { AppRouteObject } from '#/router';
+
+function MenuLevel({ title }: { title: string }) {
+ return Menu Level: {title} ;
+}
+
+const menulevel: AppRouteObject = {
+ order: 5,
+ path: 'menu_level',
+ element: (
+ }>
+
+
+ ),
+ meta: {
+ label: 'sys.menu.menulevel.index',
+ icon: ,
+ key: '/menu_level',
+ },
+ children: [
+ {
+ path: 'menu_level_1a',
+ element: ,
+ meta: { label: 'sys.menu.menulevel.1a', key: '/menu_level/menu_level_1a' },
+ },
+ {
+ path: 'menu_level_1b',
+ meta: { label: 'sys.menu.menulevel.1b.index', key: '/menu_level/menu_level_1b' },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'menu_level_2a',
+ element: ,
+ meta: {
+ label: 'sys.menu.menulevel.1b.2a',
+ key: '/menu_level/menu_level_1b/menu_level_2a',
+ },
+ },
+ {
+ path: 'menu_level_2b',
+ meta: {
+ label: 'sys.menu.menulevel.1b.2b.index',
+ key: '/menu_level/menu_level_1b/menu_level_2b',
+ },
+ children: [
+ {
+ index: true,
+ element: ,
+ },
+ {
+ path: 'menu_level_3a',
+ element: ,
+ meta: {
+ label: 'sys.menu.menulevel.1b.2b.3a',
+ key: '/menu_level/menu_level_1b/menu_level_2b/menu_level_3a',
+ },
+ },
+ {
+ path: 'menu_level_3b',
+ element: ,
+ meta: {
+ label: 'sys.menu.menulevel.1b.2b.3b',
+ key: '/menu_level/menu_level_1b/menu_level_2b/menu_level_3b',
+ },
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+export default menulevel;
diff --git a/src/router/routes/modules/others.tsx b/src/router/routes/modules/others.tsx
new file mode 100644
index 0000000..72d1d96
--- /dev/null
+++ b/src/router/routes/modules/others.tsx
@@ -0,0 +1,125 @@
+import { Suspense, lazy } from 'react';
+
+import Card from '@/components/card';
+import { Iconify, SvgIcon } from '@/components/icon';
+import { CircleLoading } from '@/components/loading';
+import ProTag from '@/theme/antd/components/tag';
+
+import { AppRouteObject } from '#/router';
+
+const ExternalLink = lazy(() => import('@/pages/sys/others/iframe/external-link'));
+const Iframe = lazy(() => import('@/pages/sys/others/iframe'));
+const Calendar = lazy(() => import('@/pages/sys/others/calendar'));
+const Kanban = lazy(() => import('@/pages/sys/others/kanban'));
+
+function Wrapper({ children }: any) {
+ return }>{children};
+}
+const others: AppRouteObject[] = [
+ {
+ path: 'calendar',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.calendar',
+ icon: ,
+ key: '/calendar',
+ },
+ },
+ {
+ path: 'kanban',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.kanban',
+ icon: ,
+ key: '/kanban',
+ },
+ },
+ {
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.disabled',
+ icon: ,
+ disabled: true,
+ key: '/disabled',
+ },
+ },
+ {
+ path: 'label',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.label',
+ icon: ,
+ suffix: (
+ }>
+ NEW
+
+ ),
+ key: '/label',
+ },
+ },
+ {
+ path: 'frame',
+ meta: {
+ label: 'sys.menu.frame',
+ icon: ,
+ key: '/frame',
+ },
+ children: [
+ {
+ path: 'external_link',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.external_link',
+ key: '/frame/external_link',
+ },
+ },
+ {
+ path: 'iframe',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.iframe',
+ key: '/frame/iframe',
+ },
+ },
+ ],
+ },
+ {
+ path: 'blank',
+ element: (
+
+
+
+ ),
+ meta: {
+ label: 'sys.menu.blank',
+ icon: ,
+ key: '/blank',
+ },
+ },
+];
+
+export default others;
diff --git a/src/router/utils.ts b/src/router/utils.ts
new file mode 100644
index 0000000..4e96f4e
--- /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 getMenuModules() {
+ 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/index.ts b/src/store/index.ts
new file mode 100644
index 0000000..881e467
--- /dev/null
+++ b/src/store/index.ts
@@ -0,0 +1,21 @@
+import { create } from 'zustand';
+
+type Store = {
+ count: number;
+ // 使用 actions 命名空间来存放所有的 action
+ actions: {
+ increment: () => void;
+ decrement: () => void;
+ };
+};
+
+const useStore = create((set) => ({
+ count: 0,
+ actions: {
+ increment: () => set((state) => ({ count: state.count + 1 })),
+ decrement: () => set((state) => ({ count: state.count - 1 })),
+ },
+}));
+
+export const useCount = () => useStore((state) => state.count);
+export const useCountActions = () => useStore((state) => state.actions);
diff --git a/src/store/settingStore.ts b/src/store/settingStore.ts
new file mode 100644
index 0000000..60c4bd8
--- /dev/null
+++ b/src/store/settingStore.ts
@@ -0,0 +1,45 @@
+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 命名空间来存放所有的 action
+ 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..a7704a9
--- /dev/null
+++ b/src/store/userStore.ts
@@ -0,0 +1,83 @@
+import { useMutation } from '@tanstack/react-query';
+import { App } from 'antd';
+import { useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+import { create } from 'zustand';
+
+import userService, { SignInReq } from '@/api/services/userService';
+import { getItem, removeItem, setItem } from '@/utils/storage';
+
+import { UserInfo, UserToken } from '#/entity';
+import { StorageEnum } from '#/enum';
+
+const { VITE_APP_HOMEPAGE: HOMEPAGE } = import.meta.env;
+
+type UserStore = {
+ userInfo: Partial;
+ userToken: UserToken;
+ // 使用 actions 命名空间来存放所有的 action
+ 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 { t } = useTranslation();
+ const navigatge = useNavigate();
+ const { notification, message } = App.useApp();
+ const { setUserToken, setUserInfo } = useUserActions();
+
+ const signInMutation = useMutation(userService.signin);
+
+ const signIn = async (data: SignInReq) => {
+ try {
+ const res = await signInMutation.mutateAsync(data);
+ const { user, accessToken, refreshToken } = res;
+ setUserToken({ accessToken, refreshToken });
+ setUserInfo(user);
+ navigatge(HOMEPAGE, { replace: true });
+
+ notification.success({
+ message: t('sys.login.loginSuccessTitle'),
+ description: `${t('sys.login.loginSuccessDesc')}: ${data.username}`,
+ duration: 3,
+ });
+ } catch (err) {
+ message.warning({
+ content: err.message,
+ duration: 3,
+ });
+ }
+ };
+
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ return useCallback(signIn, []);
+};
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..0a8dbc2
--- /dev/null
+++ b/src/theme/antd/theme.ts
@@ -0,0 +1,63 @@
+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)',
+ },
+};
+
+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..9be3745
--- /dev/null
+++ b/src/theme/global.css
@@ -0,0 +1,15 @@
+/* editor */
+@import 'react-quill/dist/quill.snow.css';
+
+/* simplebar */
+@import 'simplebar-react/dist/simplebar.min.css';
+
+/* 将 Tailwind CSS 的基础样式(也称为 "base" 样式)导入到当前文件中,包括一些基本的 HTML 元素样式、重置元素默认样式等。 */
+@import 'tailwindcss/base';
+
+/* 导入 Tailwind CSS 的组件样式,包括预定义的按钮、表格、表单、卡片等组件样式。 */
+@import 'tailwindcss/components';
+
+/* 导入 Tailwind CSS 的实用类,这些类通常用于添加与布局、间距、响应式设计等相关的样式,使得可以快速构建出复杂的页面 */
+@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..9532dc6
--- /dev/null
+++ b/src/theme/hooks/use-reponsive.ts
@@ -0,0 +1,32 @@
+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.findLast((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..a5fdd39
--- /dev/null
+++ b/src/theme/index.css
@@ -0,0 +1,5 @@
+/* 自定义重置样式 */
+@import './base.css';
+
+/* 第三方库样式 */
+@import './global.css';
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/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..fe7a70e
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,58 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ // 使用 "class" 模式时,Tailwind 会将 "dark" 类添加到根元素(通常是 元素)上,以指示页面当前处于深色模式
+ darkMode: 'class',
+ // 通过配置 content,Tailwind CSS 将会检索和构建包含需要的 CSS 样式的文件,并生成最终的 CSS 输出文件
+ 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.json b/tsconfig.json
new file mode 100644
index 0000000..463b412
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,46 @@
+{
+ "compilerOptions": {
+ "target": "ESNext", // 编译后代码的目标版本(ECMAScript)。
+ "module": "ESNext", // 使用的模块系统类型。ESNext 支持更多特性,比如动态导入等。
+ "lib": ["ESNext", "DOM", "DOM.Iterable"], // 要包含的库文件。DOM、DOM.Iterable 和 ESNext 库文件是 TypeScript 开发中比较基础的依赖。
+ "useDefineForClassFields": true,
+ "skipLibCheck": true, // 跳过编译器对引入库文件的检查,以加快构建速度
+ "allowJs": true, // 允许编译JavaScript文件
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "sourceMap": true, // 输出 *.map 文件提供源码映射
+ "declaration": true, // 是否生成声明文件(.d.ts)。
+ "preserveWatchOutput": true, // 该选项允许在监视模式下保留先前编译的文件,从而避免增量编译时删除更改的文件导致的重新编译。
+ "removeComments": true, // 是否移除注释。可以提高编译速度并减小生成文件的大小
+ "allowImportingTsExtensions": true, // 允许在 import 导入语句中导入 .ts 或 .tsx 扩展名的模块,而不需要显式地指定扩展名
+ "resolveJsonModule": true, // 允许导入json模块
+ "isolatedModules": true, // 让typescript处理每个文件时都是独立的单元(可加快编译速度)
+ "noEmit": true, // 编译器不生成任何JS文件
+ "jsx": "react-jsx",
+ // 使 TypeScript 可以更好地与 CommonJS 模块兼容。在使用 CommonJS 模块系统时,导出的模块将会被包装在一个对象中,这是因为 CommonJS 使用的是类似于 module.exports 的语法来导出模块。
+ // 而某些工具和库可能需要以 ES6 模块的方式导入这些 CommonJS 模块,这时候就可以开启 esModuleInterop 选项。
+ // 开启后,在导入 CommonJS 模块时不需要再使用默认导出才能正确引入,也不需要手动处理 require() 和 module.exports。
+ // 这使得导入和使用 CommonJS 模块的过程变得更加简洁方便。
+ "esModuleInterop": true,
+
+ /* Linting */
+ "strict": true, // 启用所有严格类型检查选项
+ "strictNullChecks": true, // 对空值进行严格检查
+ "noImplicitAny": true, // 禁止隐式any类型
+ "noUnusedLocals": true, // 消除未使用变量产生的警告
+ "noUnusedParameters": true, // 消除未使用参数产生的警告
+ "noFallthroughCasesInSwitch": true, // 避免 switch 语句掉入陷阱
+ "useUnknownInCatchVariables": false, // 为 true 时,在 catch 块中声明的变量类型会被视为 unknown 而非默认的 any。
+
+ "baseUrl": ".",
+ /* alias */
+ "paths": {
+ "@/*": ["src/*"],
+ "#/*": ["types/*"]
+ }
+ },
+ "include": ["src", "test", "types/**/*.ts", "**.ts", "*.json", "**.*js"],
+ "exclude": ["node_modules", "dist"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..42872c5
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/types/api.ts b/types/api.ts
new file mode 100644
index 0000000..7b13cc3
--- /dev/null
+++ b/types/api.ts
@@ -0,0 +1,5 @@
+export interface Result {
+ status: number;
+ message: string;
+ data?: T;
+}
diff --git a/types/entity.ts b/types/entity.ts
new file mode 100644
index 0000000..4681b1f
--- /dev/null
+++ b/types/entity.ts
@@ -0,0 +1,53 @@
+import { BasicStatus, PermissionType } from './enum';
+
+export interface UserToken {
+ accessToken?: string;
+ refreshToken?: 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;
+ frameSrc?: string;
+ newFeature?: boolean;
+ children?: Permission[];
+}
+
+export interface Role {
+ id: string;
+ name: string;
+ label: string;
+ status: BasicStatus;
+ order?: number;
+ desc?: string;
+ permission?: Permission[];
+}
diff --git a/types/enum.ts b/types/enum.ts
new file mode 100644
index 0000000..cf23187
--- /dev/null
+++ b/types/enum.ts
@@ -0,0 +1,58 @@
+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',
+ zh_CN = 'zh_CN',
+}
+
+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..3b561ba
--- /dev/null
+++ b/types/router.ts
@@ -0,0 +1,50 @@
+import { ReactNode } from 'react';
+import { 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;
+}
+export type AppRouteObject = {
+ order?: number;
+ meta?: RouteMeta;
+ children?: AppRouteObject[];
+} & Omit;
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..35e0a71
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,68 @@
+import path from 'path';
+
+import react from '@vitejs/plugin-react';
+import { visualizer } from 'rollup-plugin-visualizer';
+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: './',
+ esbuild: {
+ // drop: ['console', 'debugger'],
+ },
+ css: {
+ // 开css sourcemap方便找css
+ devSourcemap: true,
+ },
+ plugins: [
+ react(),
+ // 同步tsconfig.json的path设置alias
+ tsconfigPaths(),
+ createSvgIconsPlugin({
+ // 指定需要缓存的图标文件夹
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
+ // 指定symbolId格式
+ symbolId: 'icon-[dir]-[name]',
+ }),
+ visualizer({
+ open: false,
+ }),
+ ],
+ server: {
+ // 自动打开浏览器
+ open: true,
+ host: true,
+ port: 3001,
+ proxy: {
+ '/api': {
+ target: 'http://localhost:3000',
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, ''),
+ },
+ },
+ },
+ build: {
+ target: 'esnext',
+ minify: 'terser',
+ // rollupOptions: {
+ // output: {
+ // manualChunks(id) {
+ // if (id.includes('node_modules')) {
+ // // 让每个插件都打包成独立的文件
+ // return id.toString().split('node_modules/')[1].split('/')[0].toString();
+ // }
+ // return null;
+ // },
+ // },
+ // },
+ terserOptions: {
+ compress: {
+ // 生产环境移除console
+ drop_console: true,
+ drop_debugger: true,
+ },
+ },
+ },
+});