diff --git a/ui/.Dockerfile b/ui/.Dockerfile new file mode 100644 index 0000000..0617a94 --- /dev/null +++ b/ui/.Dockerfile @@ -0,0 +1,13 @@ +FROM nginx:1.27.5-alpine3.21 + +# 将构建好的 React 应用静态文件复制到 Nginx 的服务目录 +COPY dist /usr/share/nginx/html + +# 将自定义 Nginx 配置文件复制到容器中 +COPY nginx.conf /etc/nginx/nginx.conf + +# 暴露 80 端口 +EXPOSE 80 + +# 启动 Nginx +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 0000000..0581e2d --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,26 @@ +# 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 +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.env.local +swagger.api.config.ts diff --git a/ui/.npmrc b/ui/.npmrc new file mode 100644 index 0000000..84dc4b2 --- /dev/null +++ b/ui/.npmrc @@ -0,0 +1,4 @@ +registry=https://registry.npmmirror.com + +strict-ssl=false +auto-install-peers=true diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000..0ba2a29 --- /dev/null +++ b/ui/README.md @@ -0,0 +1,68 @@ +# baizhiyun-app-airport + +一个基于React 19和TypeScript的前端应用,使用Vite构建,Material UI作为UI框架。 + +## 技术栈 + +- React 19 +- TypeScript +- Vite +- Material UI (@mui) + Emotion +- 状态管理: ahooks +- 路由: react-router-dom v7 +- 表单: react-hook-form +- 图表: echarts +- 动画: lottie-react +- API请求: axios +- 日期处理: dayjs +- Markdown处理: react-markdown + +## 主要功能 + +1. **仪表盘**: 应用主界面,展示关键指标和数据概览 +2. **聊天功能**: 用户交流界面 +3. **完成/结果**: 展示操作结果或完成状态 +4. **模型管理**: 模型相关操作和展示 +5. **用户管理**: 用户信息管理 +6. **管理员功能**: 系统管理后台 +7. **认证和登录**: 用户认证流程 +8. **邀请系统**: 用户邀请功能 + +## 项目结构 + +``` +src/ +├── api/ # API请求相关 +├── assets/ # 静态资源 +├── components/ # 公共组件 +├── layouts/ # 布局组件 +├── pages/ # 页面组件 +│ ├── admin/ # 管理员相关 +│ ├── auth/ # 认证相关 +│ ├── chat/ # 聊天功能 +│ ├── completion/ # 完成/结果页面 +│ ├── dashboard/ # 仪表盘 +│ ├── invite/ # 邀请相关 +│ ├── login/ # 登录页面 +│ ├── model/ # 模型相关 +│ └── user/ # 用户相关 +├── router.tsx # 路由配置 +├── theme.ts # 主题配置 +├── utils/ # 工具函数 +└── main.tsx # 应用入口 +``` + +## 开发环境配置 + +1. 确保已安装Node.js (>=18.0.0) 和 pnpm +2. 克隆项目仓库 +3. 安装依赖: `pnpm install` +4. 启动开发服务器: `pnpm dev` +5. 打开浏览器访问: `http://localhost:5173` + +## 常用命令 + +- `pnpm dev`: 启动开发服务器 +- `pnpm build`: 生产环境构建 +- `pnpm preview`: 预览生产构建 +- `pnpm lint`: 运行代码检查 diff --git a/ui/api-templates/http-client.ejs b/ui/api-templates/http-client.ejs new file mode 100644 index 0000000..7164e22 --- /dev/null +++ b/ui/api-templates/http-client.ejs @@ -0,0 +1,170 @@ +<% +const { apiConfig, generateResponses, config } = it; +%> +import { message as Message } from '@c-x/ui' +import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults, ResponseType, AxiosResponse } from "axios"; +import axios from "axios"; + +export type QueryParamsType = Record; + +export interface FullRequestParams extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseType; + /** request body */ + body?: unknown; +} + +export type RequestParams = Omit; + +export interface ApiConfig extends Omit { + securityWorker?: (securityData: SecurityDataType | null) => Promise | AxiosRequestConfig | void; + secure?: boolean; + format?: ResponseType; +} + +export enum ContentType { + Json = "application/json", + FormData = "multipart/form-data", + UrlEncoded = "application/x-www-form-urlencoded", + Text = "text/plain", +} + +const redirectToLogin = () => { + const redirectAfterLogin = encodeURIComponent(location.href); + const search = `redirect=${redirectAfterLogin}`; + const pathname = '/login'; + window.location.href = `${pathname}?${search}`; +}; + +type ExtractDataProp = T extends { data?: infer U } ? U : never + + +export class HttpClient { + public instance: AxiosInstance; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig["securityWorker"]; + private secure?: boolean; + private format?: ResponseType; + + constructor({ securityWorker, secure, format, ...axiosConfig }: ApiConfig = {}) { + this.instance = axios.create({ withCredentials: true, ...axiosConfig, baseURL: axiosConfig.baseURL || '' }) + this.secure = secure; + this.format = format; + this.securityWorker = securityWorker; + this.instance.interceptors.response.use( + (resp) => { + if (resp.data.code === 0) { + return resp.data.data; + } else { + Message.error(resp.data.message) + return Promise.reject(resp.data.message) + } + }, + (err) => { + if (err?.response?.status === 401) { + Message.error('尚未登录') + redirectToLogin(); + return + } + // 手动取消请求 + if (err.code === 'ERR_CANCELED') { + return + } + const msg = err?.response?.data?.message || err?.message + Message.error(msg) + return Promise.reject(msg) + }, + ) + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data + } + + protected mergeRequestParams(params1: AxiosRequestConfig, params2?: AxiosRequestConfig): AxiosRequestConfig { + const method = params1.method || (params2 && params2.method) + + return { + ...this.instance.defaults, + ...params1, + ...(params2 || {}), + headers: { + ...((method && this.instance.defaults.headers[method.toLowerCase() as keyof HeadersDefaults]) || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected stringifyFormItem(formItem: unknown) { + if (typeof formItem === "object" && formItem !== null) { + return JSON.stringify(formItem); + } else { + return `${formItem}`; + } + } + + protected createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + const propertyContent: any[] = (property instanceof Array) ? property : [property] + + for (const formItem of propertyContent) { + const isFileType = formItem instanceof Blob || formItem instanceof File; + formData.append( + key, + isFileType ? formItem : this.stringifyFormItem(formItem) + ); + } + + return formData; + }, new FormData()); + } + + public request = async ({ + secure, + path, + type, + query, + format, + body, + ...params +<% if (config.unwrapResponseData) { %> + }: FullRequestParams): Promise> => { +<% } else { %> + }: FullRequestParams): Promise> => { +<% } %> + const secureParams = ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const responseFormat = (format || this.format) || undefined; + + if (type === ContentType.FormData && body && body !== null && typeof body === "object") { + body = this.createFormData(body as Record); + } + + if (type === ContentType.Text && body && body !== null && typeof body !== "string") { + body = JSON.stringify(body); + } + + return this.instance.request({ + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}), + }, + params: query, + responseType: responseFormat, + data: body, + url: path, + }) + }; +} +export default new HttpClient({ format: 'json' }).request \ No newline at end of file diff --git a/ui/eslint.config.js b/ui/eslint.config.js new file mode 100644 index 0000000..eba8fce --- /dev/null +++ b/ui/eslint.config.js @@ -0,0 +1,31 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + // 'react-refresh/only-export-components': [ + // 'warn', + // { allowConstantExport: true }, + // ], + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": "warn", + }, + }, +) diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..61aa9f0 --- /dev/null +++ b/ui/index.html @@ -0,0 +1,21 @@ + + + + + + + MonkeyCode + + + +
+ + + diff --git a/ui/nginx.conf b/ui/nginx.conf new file mode 100644 index 0000000..94c066f --- /dev/null +++ b/ui/nginx.conf @@ -0,0 +1,37 @@ +worker_processes 1; +user nginx nginx; +events { + worker_connections 4096; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" "$host"'; + + error_log /var/log/nginx/error.log error; + access_log /var/log/nginx/access.log main; + + sendfile on; + keepalive_timeout 65; + client_body_buffer_size 128k; + client_header_buffer_size 2k; + + gzip on; + gzip_types applicaiton/javascript text/css image/png image/jpeg image/gif; + + server { + listen 80; + listen [::]:80; + server_name _; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + } +} \ No newline at end of file diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..67af1c7 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,56 @@ +{ + "name": "baizhiyun-app-airport", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "icon": "node ./scripts/downloadIcon.cjs", + "api": "cx-swagger-api", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@c-x/ui": "^1.0.9", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^6.4.12", + "@mui/lab": "6.0.0-beta.19", + "@mui/material": "^6.4.12", + "ahooks": "^3.8.4", + "axios": "^1.9.0", + "dayjs": "^1.11.7", + "decimal.js": "^10.5.0", + "echarts": "^5.6.0", + "lottie-react": "^2.4.1", + "react": "^19.1.0", + "react-activity-calendar": "^2.7.12", + "react-copy-to-clipboard": "^5.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "^7.56.4", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.6.0", + "react-syntax-highlighter": "^15.6.1", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "remark-breaks": "^4.0.0", + "remark-gfm": "^4.0.1" + }, + "devDependencies": { + "@c-x/cx-swagger-api": "^0.0.10", + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-copy-to-clipboard": "^5.0.7", + "@types/react-dom": "^19.1.2", + "@types/react-syntax-highlighter": "^15.5.13", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.30.1", + "vite": "^6.3.5" + } +} \ No newline at end of file diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml new file mode 100644 index 0000000..b3ec09f --- /dev/null +++ b/ui/pnpm-lock.yaml @@ -0,0 +1,5023 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@c-x/ui': + specifier: ^1.0.9 + version: 1.0.9(08ce6c0344fc571b49287dbbd28510a8) + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': + specifier: ^11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/icons-material': + specifier: ^6.4.12 + version: 6.4.12(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/lab': + specifier: 6.0.0-beta.19 + version: 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/material': + specifier: ^6.4.12 + version: 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + ahooks: + specifier: ^3.8.4 + version: 3.8.5(react@19.1.0) + axios: + specifier: ^1.9.0 + version: 1.10.0 + dayjs: + specifier: ^1.11.7 + version: 1.11.13 + decimal.js: + specifier: ^10.5.0 + version: 10.5.0 + echarts: + specifier: ^5.6.0 + version: 5.6.0 + lottie-react: + specifier: ^2.4.1 + version: 2.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: + specifier: ^19.1.0 + version: 19.1.0 + react-activity-calendar: + specifier: ^2.7.12 + version: 2.7.12(react@19.1.0) + react-copy-to-clipboard: + specifier: ^5.1.0 + version: 5.1.0(react@19.1.0) + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + react-hook-form: + specifier: ^7.56.4 + version: 7.58.1(react@19.1.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.8)(react@19.1.0) + react-router-dom: + specifier: ^7.6.0 + version: 7.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-syntax-highlighter: + specifier: ^15.6.1 + version: 15.6.1(react@19.1.0) + rehype-raw: + specifier: ^7.0.0 + version: 7.0.0 + rehype-sanitize: + specifier: ^6.0.0 + version: 6.0.0 + remark-breaks: + specifier: ^4.0.0 + version: 4.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + devDependencies: + '@c-x/cx-swagger-api': + specifier: ^0.0.10 + version: 0.0.10(@types/node@24.0.4)(typescript@5.8.3) + '@eslint/js': + specifier: ^9.25.0 + version: 9.29.0 + '@types/react': + specifier: ^19.1.2 + version: 19.1.8 + '@types/react-copy-to-clipboard': + specifier: ^5.0.7 + version: 5.0.7 + '@types/react-dom': + specifier: ^19.1.2 + version: 19.1.6(@types/react@19.1.8) + '@types/react-syntax-highlighter': + specifier: ^15.5.13 + version: 15.5.13 + '@vitejs/plugin-react': + specifier: ^4.4.1 + version: 4.6.0(vite@6.3.5(@types/node@24.0.4)(jiti@2.4.2)) + eslint: + specifier: ^9.25.0 + version: 9.29.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.29.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.20(eslint@9.29.0(jiti@2.4.2)) + globals: + specifier: ^16.0.0 + version: 16.2.0 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.30.1 + version: 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@24.0.4)(jiti@2.4.2) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@biomejs/js-api@1.0.0': + resolution: {integrity: sha512-69OfQ7+09AtiCIg+k+aU3rEsGit5o/SJWCS3BeBH/2nJYdJGi0cIx+ybka8i1EK69aNcZxYO1y1iAAEmYMq1HA==} + peerDependencies: + '@biomejs/wasm-bundler': ^2.0.0 + '@biomejs/wasm-nodejs': ^2.0.0 + '@biomejs/wasm-web': ^2.0.0 + peerDependenciesMeta: + '@biomejs/wasm-bundler': + optional: true + '@biomejs/wasm-nodejs': + optional: true + '@biomejs/wasm-web': + optional: true + + '@biomejs/wasm-nodejs@2.0.5': + resolution: {integrity: sha512-pihpBMylewgDdGFZHRkgmc3OajuGIJPXhvfYuKCNK/CWyJMrYEFmPKs8Iq1kY0sYMmGlTbD4K2udV03KYa+r0Q==} + + '@c-x/cx-swagger-api@0.0.10': + resolution: {integrity: sha512-CWBgJEAw2fsjOIlxmFyjoR8/wQ85Dp7CJDy88sFcS7ycGrOHEEGaKX/qIcBDkhi3yD2gBxnQBWZgQvdL+P9Z9g==} + hasBin: true + + '@c-x/ui@1.0.9': + resolution: {integrity: sha512-dBXpiKK0KPGJ/g3QOfPBm3lxdrt0uyjl8g9gXOCtcM/3Fa0kxUaG0V7HZSRQRnpbDGhDkw1GJZ1I+keQ/vsDaQ==} + peerDependencies: + '@emotion/react': ^11 + '@emotion/styled': ^11 + '@mui/icons-material': ^6 + '@mui/lab': ^6.0.0-beta.7 + '@mui/material': ^6 + '@mui/utils': ^6 + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.29.0': + resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@floating-ui/core@1.7.1': + resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} + + '@floating-ui/dom@1.7.1': + resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} + + '@floating-ui/react-dom@2.1.3': + resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mui/base@5.0.0-beta.66': + resolution: {integrity: sha512-1SzcNbtIms0o/Dx+599B6QbvR5qUMBUjwc2Gs47h1HsF7RcEFXxqaq7zrWkIWbvGctIIPx0j330oGx/SkF+UmA==} + engines: {node: '>=14.0.0'} + deprecated: This package has been replaced by @base-ui-components/react + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@6.4.12': + resolution: {integrity: sha512-M7IkG4LqSJfkY+thlQQHNkcS5NdmMDwLq/2RKoW40XR0mv/2BYb6X8fRnyaxP4zGdPD2M4MQdbzKihSVormJ7Q==} + + '@mui/icons-material@6.4.12': + resolution: {integrity: sha512-ILTe3A2te0+Vb9TG4P1AZVmZFOjDDCV/b2nBmV1rNOmSu3Q/xkHghW+yMhMffwHcXklMlcajMlc4iFSkPbrTKw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@mui/material': ^6.4.12 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/lab@6.0.0-beta.19': + resolution: {integrity: sha512-t7iub8kjpLdA5uDGwGnNRjtGc1vYEUnDwSROjKrnYqjOlCQhBajFa8uoQtaST6jE/VEk6cxpDMnN5MalC6YpCg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': ^6.2.0 + '@mui/material-pigment-css': ^6.2.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/material@6.4.12': + resolution: {integrity: sha512-VqoLNS5UaNqoS1FybezZR/PaAvzbTmRe0Mx//afXbolIah43eozpX2FckaFffLvMoiSIyxx1+AMHyENTr2Es0Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material-pigment-css': ^6.4.12 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@6.4.9': + resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@6.4.11': + resolution: {integrity: sha512-74AUmlHXaGNbyUqdK/+NwDJOZqgRQw6BcNvhoWYLq3LGbLTkE+khaJ7soz6cIabE4CPYqO2/QAIU1Z/HEjjpcw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@6.4.12': + resolution: {integrity: sha512-fgEfm1qxpKCztndESeL1L0sLwA2c7josZ2w42D8OM3pbLee4bH2twEjoMo6qf7z2rNw1Uc9EU9haXeMoq0oTdQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.24': + resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/types@7.4.3': + resolution: {integrity: sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@6.4.9': + resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + + '@rollup/rollup-android-arm-eabi@4.44.0': + resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.44.0': + resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.44.0': + resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.44.0': + resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.44.0': + resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.44.0': + resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.44.0': + resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.44.0': + resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.44.0': + resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.44.0': + resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.44.0': + resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.44.0': + resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.44.0': + resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.44.0': + resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.44.0': + resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.44.0': + resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.44.0': + resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} + cpu: [x64] + os: [win32] + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@24.0.4': + resolution: {integrity: sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-copy-to-clipboard@5.0.7': + resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} + + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-syntax-highlighter@15.5.13': + resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} + + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/swagger-schema-official@2.0.25': + resolution: {integrity: sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.35.0': + resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.35.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.35.0': + resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.35.0': + resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.35.0': + resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.35.0': + resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.35.0': + resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.35.0': + resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.35.0': + resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.35.0': + resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.35.0': + resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ahooks@3.8.5: + resolution: {integrity: sha512-Y+MLoJpBXVdjsnnBjE5rOSPkQ4DK+8i5aPDzLJdIOsCpo/fiAeXcBY1Y7oWgtOK0TpOz0gFa/XcyO1UGdoqLcw==} + engines: {node: '>=8.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + c12@3.0.4: + resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001724: + resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + cosmiconfig-typescript-loader@5.1.0: + resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + electron-to-chromium@1.5.173: + resolution: {integrity: sha512-2bFhXP2zqSfQHugjqJIDFVwa+qIxyNApenmXTp9EjaKtdPrES5Qcn9/aSFy/NaP2E+fWG/zxKu/LBvY36p5VNQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + 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.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + 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==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lottie-react@2.4.1: + resolution: {integrity: sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lottie-web@5.13.0: + resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} + + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-newline-to-break@2.0.0: + resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + + 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 + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + react-activity-calendar@2.7.12: + resolution: {integrity: sha512-OzVconQ5LA/uF2ZN3zDeWZb4UxjOmGr1ymaGCSEAMLSzwjzP7ojdyZs8DyV7jcV+rZ+lmwp6BTpBJqdW8ehXyw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react-copy-to-clipboard@5.1.0: + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-hook-form@7.58.1: + resolution: {integrity: sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@19.1.0: + resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-router-dom@7.6.2: + resolution: {integrity: sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.6.2: + resolution: {integrity: sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-syntax-highlighter@15.6.1: + resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} + peerDependencies: + react: '>= 0.14.0' + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-virtuoso@4.13.0: + resolution: {integrity: sha512-XHv2Fglpx80yFPdjZkV9d1baACKghg/ucpDFEXwaix7z0AfVQj+mF6lM+YQR6UC/TwzXG2rJKydRMb3+7iV3PA==} + peerDependencies: + react: '>=16 || >=17 || >= 18 || >= 19' + react-dom: '>=16 || >=17 || >= 18 || >=19' + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + remark-breaks@4.0.0: + resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.44.0: + resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swagger-schema-official@2.0.0-bab6bed: + resolution: {integrity: sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==} + + swagger-typescript-api@13.2.5: + resolution: {integrity: sha512-YJZqvHGNL0MijS/RXsxSNYQNXrv4yAycM6l9wNgPUowElNNGKtv+78+Rn50AkiCwHpj8tm5lEKfw8Xy6vRjH5A==} + engines: {node: '>=20'} + hasBin: true + + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.35.0: + resolution: {integrity: sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.27.5': {} + + '@babel/core@7.27.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@biomejs/js-api@1.0.0(@biomejs/wasm-nodejs@2.0.5)': + optionalDependencies: + '@biomejs/wasm-nodejs': 2.0.5 + + '@biomejs/wasm-nodejs@2.0.5': {} + + '@c-x/cx-swagger-api@0.0.10(@types/node@24.0.4)(typescript@5.8.3)': + dependencies: + cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig-typescript-loader: 5.1.0(@types/node@24.0.4)(cosmiconfig@8.3.6(typescript@5.8.3))(typescript@5.8.3) + fs-extra: 11.3.0 + lodash-es: 4.17.21 + swagger-typescript-api: 13.2.5 + transitivePeerDependencies: + - '@biomejs/wasm-bundler' + - '@biomejs/wasm-web' + - '@types/node' + - encoding + - magicast + - typescript + + '@c-x/ui@1.0.9(08ce6c0344fc571b49287dbbd28510a8)': + dependencies: + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/icons-material': 6.4.12(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/lab': 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/material': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-virtuoso: 4.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.27.6 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) + '@emotion/utils': 1.4.2 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.0)': + dependencies: + react: 19.1.0 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.4.2))': + dependencies: + eslint: 9.29.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.1': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.3': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.29.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.2': + dependencies: + '@eslint/core': 0.15.0 + levn: 0.4.1 + + '@exodus/schemasafe@1.3.0': {} + + '@floating-ui/core@1.7.1': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.7.1': + dependencies: + '@floating-ui/core': 1.7.1 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.7.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/utils@0.2.9': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mui/base@5.0.0-beta.66(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@floating-ui/react-dom': 2.1.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/types': 7.4.3(@types/react@19.1.8) + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + + '@mui/core-downloads-tracker@6.4.12': {} + + '@mui/icons-material@6.4.12(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/material': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/base': 5.0.0-beta.66(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/material': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@mui/system': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/types': 7.4.3(@types/react@19.1.8) + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@types/react': 19.1.8 + + '@mui/material@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/core-downloads-tracker': 6.4.12 + '@mui/system': 6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@mui/types': 7.2.24(@types/react@19.1.8) + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@19.1.8) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-is: 19.1.0 + react-transition-group: 4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@types/react': 19.1.8 + + '@mui/private-theming@6.4.9(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@mui/styled-engine@6.4.11(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + + '@mui/system@6.4.12(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/private-theming': 6.4.9(@types/react@19.1.8)(react@19.1.0) + '@mui/styled-engine': 6.4.11(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) + '@mui/types': 7.2.24(@types/react@19.1.8) + '@mui/utils': 6.4.9(@types/react@19.1.8)(react@19.1.0) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.0 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.1.0) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0) + '@types/react': 19.1.8 + + '@mui/types@7.2.24(@types/react@19.1.8)': + optionalDependencies: + '@types/react': 19.1.8 + + '@mui/types@7.4.3(@types/react@19.1.8)': + dependencies: + '@babel/runtime': 7.27.6 + optionalDependencies: + '@types/react': 19.1.8 + + '@mui/utils@6.4.9(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@mui/types': 7.2.24(@types/react@19.1.8) + '@types/prop-types': 15.7.15 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.1.0 + react-is: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@popperjs/core@2.11.8': {} + + '@rolldown/pluginutils@1.0.0-beta.19': {} + + '@rollup/rollup-android-arm-eabi@4.44.0': + optional: true + + '@rollup/rollup-android-arm64@4.44.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.44.0': + optional: true + + '@rollup/rollup-darwin-x64@4.44.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.44.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.44.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.44.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.44.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.44.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.44.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.44.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.44.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.44.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.44.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.44.0': + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.27.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.27.6 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/node@24.0.4': + dependencies: + undici-types: 7.8.0 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.15': {} + + '@types/react-copy-to-clipboard@5.0.7': + dependencies: + '@types/react': 19.1.8 + + '@types/react-dom@19.1.6(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@types/react-syntax-highlighter@15.5.13': + dependencies: + '@types/react': 19.1.8 + + '@types/react-transition-group@4.4.12(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@types/react@19.1.8': + dependencies: + csstype: 3.1.3 + + '@types/swagger-schema-official@2.0.25': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + eslint: 9.29.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + debug: 4.4.1 + eslint: 9.29.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.35.0': + dependencies: + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 + + '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.29.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.35.0': {} + + '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + eslint: 9.29.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.35.0': + dependencies: + '@typescript-eslint/types': 8.35.0 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@24.0.4)(jiti@2.4.2))': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.5(@types/node@24.0.4)(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ahooks@3.8.5(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + dayjs: 1.11.13 + intersection-observer: 0.12.2 + js-cookie: 3.0.5 + lodash: 4.17.21 + react: 19.1.0 + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.8.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.10.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.3 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.27.6 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.0: + dependencies: + caniuse-lite: 1.0.30001724 + electron-to-chromium: 1.5.173 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) + + c12@3.0.4: + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.5.0 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.1.0 + rc9: 2.1.2 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001724: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + concat-map@0.0.1: {} + + confbox@0.2.2: {} + + consola@3.4.2: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@1.0.2: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + cosmiconfig-typescript-loader@5.1.0(@types/node@24.0.4)(cosmiconfig@8.3.6(typescript@5.8.3))(typescript@5.8.3): + dependencies: + '@types/node': 24.0.4 + cosmiconfig: 8.3.6(typescript@5.8.3) + jiti: 1.21.7 + typescript: 5.8.3 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.8.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.8.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + date-fns@4.1.0: {} + + dayjs@1.11.13: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decimal.js@10.5.0: {} + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.27.6 + csstype: 3.1.3 + + dotenv@16.5.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + electron-to-chromium@1.5.173: {} + + emoji-regex@8.0.0: {} + + entities@6.0.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es6-promise@3.3.1: {} + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-plugin-react-hooks@5.2.0(eslint@9.29.0(jiti@2.4.2)): + dependencies: + eslint: 9.29.0(jiti@2.4.2) + + eslint-plugin-react-refresh@0.4.20(eslint@9.29.0(jiti@2.4.2)): + dependencies: + eslint: 9.29.0(jiti@2.4.2) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.29.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.2 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + esutils@2.0.3: {} + + eta@2.2.0: {} + + exsolve@1.0.7: {} + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@1.0.4: + dependencies: + format: 0.2.2 + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + format@0.2.2: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.6.0 + pathe: 2.0.3 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@16.2.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@2.2.5: {} + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + highlight.js@10.7.3: {} + + highlightjs-vue@1.0.0: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + + http2-client@1.3.5: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inline-style-parser@0.2.4: {} + + intersection-observer@0.12.2: {} + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.2.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + isexe@2.0.0: {} + + jiti@1.21.7: {} + + jiti@2.4.2: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lottie-react@2.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + lottie-web: 5.13.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + lottie-web@5.13.0: {} + + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-newline-to-break@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-find-and-replace: 3.0.2 + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + nanoid@5.1.5: {} + + natural-compare@1.4.0: {} + + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch-native@1.6.6: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + + node-releases@2.0.19: {} + + nypm@0.6.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.1.0 + tinyexec: 0.3.2 + + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.2 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.2 + + object-assign@4.1.1: {} + + ohash@2.0.11: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + 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 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prismjs@1.27.0: {} + + prismjs@1.30.0: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + + react-activity-calendar@2.7.12(react@19.1.0): + dependencies: + date-fns: 4.1.0 + react: 19.1.0 + + react-copy-to-clipboard@5.1.0(react@19.1.0): + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 19.1.0 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-fast-compare@3.2.2: {} + + react-hook-form@7.58.1(react@19.1.0): + dependencies: + react: 19.1.0 + + react-is@16.13.1: {} + + react-is@19.1.0: {} + + react-markdown@10.1.0(@types/react@19.1.8)(react@19.1.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.8 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-refresh@0.17.0: {} + + react-router-dom@7.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-router: 7.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + react-router@7.6.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + cookie: 1.0.2 + react: 19.1.0 + set-cookie-parser: 2.7.1 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + react-syntax-highlighter@15.6.1(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 + lowlight: 1.20.0 + prismjs: 1.30.0 + react: 19.1.0 + refractor: 3.6.0 + + react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.27.6 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react-virtuoso@4.13.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react@19.1.0: {} + + readdirp@4.1.2: {} + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + reftools@1.1.9: {} + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + remark-breaks@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-newline-to-break: 2.0.0 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + require-directory@2.1.1: {} + + resize-observer-polyfill@1.5.1: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.44.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.44.0 + '@rollup/rollup-android-arm64': 4.44.0 + '@rollup/rollup-darwin-arm64': 4.44.0 + '@rollup/rollup-darwin-x64': 4.44.0 + '@rollup/rollup-freebsd-arm64': 4.44.0 + '@rollup/rollup-freebsd-x64': 4.44.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 + '@rollup/rollup-linux-arm-musleabihf': 4.44.0 + '@rollup/rollup-linux-arm64-gnu': 4.44.0 + '@rollup/rollup-linux-arm64-musl': 4.44.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-gnu': 4.44.0 + '@rollup/rollup-linux-riscv64-musl': 4.44.0 + '@rollup/rollup-linux-s390x-gnu': 4.44.0 + '@rollup/rollup-linux-x64-gnu': 4.44.0 + '@rollup/rollup-linux-x64-musl': 4.44.0 + '@rollup/rollup-win32-arm64-msvc': 4.44.0 + '@rollup/rollup-win32-ia32-msvc': 4.44.0 + '@rollup/rollup-win32-x64-msvc': 4.44.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + scheduler@0.26.0: {} + + screenfull@5.2.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-cookie-parser@2.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + + source-map-js@1.2.1: {} + + source-map@0.5.7: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + stylis@4.2.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swagger-schema-official@2.0.0-bab6bed: {} + + swagger-typescript-api@13.2.5: + dependencies: + '@biomejs/js-api': 1.0.0(@biomejs/wasm-nodejs@2.0.5) + '@biomejs/wasm-nodejs': 2.0.5 + '@types/swagger-schema-official': 2.0.25 + c12: 3.0.4 + citty: 0.1.6 + consola: 3.4.2 + eta: 2.2.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + nanoid: 5.1.5 + swagger-schema-official: 2.0.0-bab6bed + swagger2openapi: 7.0.8 + typescript: 5.8.3 + transitivePeerDependencies: + - '@biomejs/wasm-bundler' + - '@biomejs/wasm-web' + - encoding + - magicast + + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.2 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.29.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + undici-types@7.8.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + update-browserslist-db@1.1.3(browserslist@4.25.0): + dependencies: + browserslist: 4.25.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite@6.3.5(@types/node@24.0.4)(jiti@2.4.2): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.6 + rollup: 4.44.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.0.4 + fsevents: 2.3.3 + jiti: 2.4.2 + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + 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 + + yocto-queue@0.1.0: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 + + zwitch@2.0.4: {} diff --git a/ui/public/Mono.ttf b/ui/public/Mono.ttf new file mode 100644 index 0000000..bf3ed52 Binary files /dev/null and b/ui/public/Mono.ttf differ diff --git a/ui/public/logo.png b/ui/public/logo.png new file mode 100644 index 0000000..b284ef8 Binary files /dev/null and b/ui/public/logo.png differ diff --git a/ui/scripts/downLoadIcon.cjs b/ui/scripts/downLoadIcon.cjs new file mode 100644 index 0000000..b9a242c --- /dev/null +++ b/ui/scripts/downLoadIcon.cjs @@ -0,0 +1,64 @@ +const fs = require('fs') +const path = require('path') + +const Axios = require('axios') + +async function downloadFile(url) { + try { + const iconPath = path.resolve(__dirname, '../src/assets/fonts/iconfont.js') + const iconDir = path.dirname(iconPath) + + // 检查目录是否存在,如果不存在则创建 + if (!fs.existsSync(iconDir)) { + console.log(`目录 ${iconDir} 不存在,正在创建...`) + fs.mkdirSync(iconDir, { recursive: true }) + console.log('目录创建成功') + } + + console.log(`开始下载图标文件到: ${iconPath}`) + + const writer = fs.createWriteStream(iconPath) + const response = await Axios({ + url: `https:${url}`, + method: 'GET', + responseType: 'stream', + timeout: 30000, // 30秒超时 + }) + + response.data.pipe(writer) + + return new Promise((resolve, reject) => { + writer.on('finish', () => { + console.log('图标文件下载成功!') + resolve() + }) + writer.on('error', (err) => { + console.error('写入文件时出错:', err.message) + reject(err) + }) + }) + } catch (error) { + console.error('下载过程中出错:', error.message) + throw error + } +} + +async function main() { + const argument = process.argv.splice(2) + + if (!argument[0]) { + console.error('错误: 请提供下载URL作为参数') + console.log('使用方法: node downLoadIcon.cjs ') + process.exit(1) + } + + try { + await downloadFile(argument[0]) + console.log('所有操作完成!') + } catch (error) { + console.error('脚本执行失败:', error.message) + process.exit(1) + } +} + +main() diff --git a/ui/src/api/Billing.ts b/ui/src/api/Billing.ts new file mode 100644 index 0000000..1150e12 --- /dev/null +++ b/ui/src/api/Billing.ts @@ -0,0 +1,144 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import request, { ContentType, RequestParams } from "./httpClient"; +import { + DomainChatInfo, + DomainCompletionInfo, + DomainListChatRecordResp, + DomainListCompletionRecordResp, + GetChatInfoParams, + GetCompletionInfoParams, + GetListChatRecordParams, + GetListCompletionRecordParams, + WebResp, +} from "./types"; + +/** + * @description 获取对话内容 + * + * @tags Billing + * @name GetChatInfo + * @summary 获取对话内容 + * @request GET:/api/v1/billing/chat/info + * @response `200` `(WebResp & { + data?: DomainChatInfo, + +})` OK + */ + +export const getChatInfo = ( + query: GetChatInfoParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainChatInfo; + } + >({ + path: `/api/v1/billing/chat/info`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取对话记录 + * + * @tags Billing + * @name GetListChatRecord + * @summary 获取对话记录 + * @request GET:/api/v1/billing/chat/record + * @response `200` `(WebResp & { + data?: DomainListChatRecordResp, + +})` OK + */ + +export const getListChatRecord = ( + query: GetListChatRecordParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListChatRecordResp; + } + >({ + path: `/api/v1/billing/chat/record`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取补全内容 + * + * @tags Billing + * @name GetCompletionInfo + * @summary 获取补全内容 + * @request GET:/api/v1/billing/completion/info + * @response `200` `(WebResp & { + data?: DomainCompletionInfo, + +})` OK + */ + +export const getCompletionInfo = ( + query: GetCompletionInfoParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainCompletionInfo; + } + >({ + path: `/api/v1/billing/completion/info`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取补全记录 + * + * @tags Billing + * @name GetListCompletionRecord + * @summary 获取补全记录 + * @request GET:/api/v1/billing/completion/record + * @response `200` `(WebResp & { + data?: DomainListCompletionRecordResp, + +})` OK + */ + +export const getListCompletionRecord = ( + query: GetListCompletionRecordParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListCompletionRecordResp; + } + >({ + path: `/api/v1/billing/completion/record`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); diff --git a/ui/src/api/Dashboard.ts b/ui/src/api/Dashboard.ts new file mode 100644 index 0000000..f04426e --- /dev/null +++ b/ui/src/api/Dashboard.ts @@ -0,0 +1,220 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import request, { ContentType, RequestParams } from "./httpClient"; +import { + DomainCategoryStat, + DomainStatistics, + DomainTimeStat, + DomainUserCodeRank, + DomainUserEvent, + DomainUserHeatmapResp, + DomainUserStat, + GetUserEventsDashboardParams, + GetUserHeatmapDashboardParams, + GetUserStatDashboardParams, + WebResp, +} from "./types"; + +/** + * @description 获取分类统计信息 + * + * @tags Dashboard + * @name GetCategoryStatDashboard + * @summary 获取分类统计信息 + * @request GET:/api/v1/dashboard/category-stat + * @response `200` `(WebResp & { + data?: DomainCategoryStat, + +})` OK + */ + +export const getCategoryStatDashboard = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainCategoryStat; + } + >({ + path: `/api/v1/dashboard/category-stat`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取统计信息 + * + * @tags Dashboard + * @name GetStatisticsDashboard + * @summary 获取统计信息 + * @request GET:/api/v1/dashboard/statistics + * @response `200` `(WebResp & { + data?: DomainStatistics, + +})` OK + */ + +export const getStatisticsDashboard = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainStatistics; + } + >({ + path: `/api/v1/dashboard/statistics`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取时间统计信息 + * + * @tags Dashboard + * @name GetTimeStatDashboard + * @summary 获取时间统计信息 + * @request GET:/api/v1/dashboard/time-stat + * @response `200` `(WebResp & { + data?: DomainTimeStat, + +})` OK + */ + +export const getTimeStatDashboard = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainTimeStat; + } + >({ + path: `/api/v1/dashboard/time-stat`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 用户贡献榜 + * + * @tags Dashboard + * @name GetUserCodeRankDashboard + * @summary 用户贡献榜 + * @request GET:/api/v1/dashboard/user-code-rank + * @response `200` `(WebResp & { + data?: (DomainUserCodeRank)[], + +})` OK + */ + +export const getUserCodeRankDashboard = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainUserCodeRank[]; + } + >({ + path: `/api/v1/dashboard/user-code-rank`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取用户事件 + * + * @tags Dashboard + * @name GetUserEventsDashboard + * @summary 获取用户事件 + * @request GET:/api/v1/dashboard/user-events + * @response `200` `(WebResp & { + data?: (DomainUserEvent)[], + +})` OK + */ + +export const getUserEventsDashboard = ( + query: GetUserEventsDashboardParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainUserEvent[]; + } + >({ + path: `/api/v1/dashboard/user-events`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 用户热力图 + * + * @tags Dashboard + * @name GetUserHeatmapDashboard + * @summary 用户热力图 + * @request GET:/api/v1/dashboard/user-heatmap + * @response `200` `(WebResp & { + data?: DomainUserHeatmapResp, + +})` OK + */ + +export const getUserHeatmapDashboard = ( + query: GetUserHeatmapDashboardParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainUserHeatmapResp; + } + >({ + path: `/api/v1/dashboard/user-heatmap`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取用户统计信息 + * + * @tags Dashboard + * @name GetUserStatDashboard + * @summary 获取用户统计信息 + * @request GET:/api/v1/dashboard/user-stat + * @response `200` `(WebResp & { + data?: DomainUserStat, + +})` OK + */ + +export const getUserStatDashboard = ( + query: GetUserStatDashboardParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainUserStat; + } + >({ + path: `/api/v1/dashboard/user-stat`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); diff --git a/ui/src/api/Model.ts b/ui/src/api/Model.ts new file mode 100644 index 0000000..b6f5f6d --- /dev/null +++ b/ui/src/api/Model.ts @@ -0,0 +1,200 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import request, { ContentType, RequestParams } from "./httpClient"; +import { + DomainAllModelResp, + DomainCheckModelReq, + DomainCreateModelReq, + DomainModel, + DomainModelTokenUsageResp, + DomainUpdateModelReq, + GetGetTokenUsageParams, + GetMyModelListParams, + WebResp, +} from "./types"; + +/** + * @description 获取模型列表 + * + * @tags Model + * @name GetListModel + * @summary 获取模型列表 + * @request GET:/api/v1/model + * @response `200` `(WebResp & { + data?: DomainAllModelResp, + +})` OK + */ + +export const getListModel = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainAllModelResp; + } + >({ + path: `/api/v1/model`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 更新模型 + * + * @tags Model + * @name PutUpdateModel + * @summary 更新模型 + * @request PUT:/api/v1/model + * @response `200` `(WebResp & { + data?: DomainModel, + +})` OK + */ + +export const putUpdateModel = ( + model: DomainUpdateModelReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainModel; + } + >({ + path: `/api/v1/model`, + method: "PUT", + body: model, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 创建模型 + * + * @tags Model + * @name PostCreateModel + * @summary 创建模型 + * @request POST:/api/v1/model + * @response `200` `(WebResp & { + data?: DomainModel, + +})` OK + */ + +export const postCreateModel = ( + model: DomainCreateModelReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainModel; + } + >({ + path: `/api/v1/model`, + method: "POST", + body: model, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 检查模型 + * + * @tags Model + * @name PostCheckModel + * @summary 检查模型 + * @request POST:/api/v1/model/check + * @response `200` `(WebResp & { + data?: DomainModel, + +})` OK + */ + +export const postCheckModel = ( + model: DomainCheckModelReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainModel; + } + >({ + path: `/api/v1/model/check`, + method: "POST", + body: model, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取我的模型列表 + * + * @tags Model + * @name GetMyModelList + * @summary 获取我的模型列表 + * @request GET:/api/v1/model/my + * @response `200` `(WebResp & { + data?: (DomainModel)[], + +})` OK + */ + +export const getMyModelList = ( + query: GetMyModelListParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainModel[]; + } + >({ + path: `/api/v1/model/my`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取模型token使用情况 + * + * @tags Model + * @name GetGetTokenUsage + * @summary 获取模型token使用情况 + * @request GET:/api/v1/model/token-usage + * @response `200` `(WebResp & { + data?: DomainModelTokenUsageResp, + +})` OK + */ + +export const getGetTokenUsage = ( + query: GetGetTokenUsageParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainModelTokenUsageResp; + } + >({ + path: `/api/v1/model/token-usage`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); diff --git a/ui/src/api/OpenAiv1.ts b/ui/src/api/OpenAiv1.ts new file mode 100644 index 0000000..a1993d1 --- /dev/null +++ b/ui/src/api/OpenAiv1.ts @@ -0,0 +1,116 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import request, { ContentType, RequestParams } from "./httpClient"; +import { DomainModelListResp, WebResp } from "./types"; + +/** + * @description 处理聊天补全请求 + * + * @tags OpenAIV1 + * @name PostChatCompletion + * @summary 处理聊天补全请求 + * @request POST:/v1/chat/completions + * @response `200` `WebResp` OK + */ + +export const postChatCompletion = (params: RequestParams = {}) => + request({ + path: `/v1/chat/completions`, + method: "POST", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 接受补全请求 + * + * @tags OpenAIV1 + * @name PostAcceptCompletion + * @summary 接受补全请求 + * @request POST:/v1/completion/accept + * @response `200` `WebResp` OK + */ + +export const postAcceptCompletion = (params: RequestParams = {}) => + request({ + path: `/v1/completion/accept`, + method: "POST", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 处理文本补全请求 + * + * @tags OpenAIV1 + * @name PostCompletions + * @summary 处理文本补全请求 + * @request POST:/v1/completions + * @response `200` `WebResp` OK + */ + +export const postCompletions = (params: RequestParams = {}) => + request({ + path: `/v1/completions`, + method: "POST", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 处理嵌入请求 + * + * @tags OpenAIV1 + * @name PostEmbeddings + * @summary 处理嵌入请求 + * @request POST:/v1/embeddings + * @response `200` `WebResp` OK + */ + +export const postEmbeddings = (params: RequestParams = {}) => + request({ + path: `/v1/embeddings`, + method: "POST", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 模型列表 + * + * @tags OpenAIV1 + * @name GetModelList + * @summary 模型列表 + * @request GET:/v1/models + * @response `200` `(WebResp & { + data?: DomainModelListResp, + +})` OK + */ + +export const getModelList = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainModelListResp; + } + >({ + path: `/v1/models`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); diff --git a/ui/src/api/User.ts b/ui/src/api/User.ts new file mode 100644 index 0000000..35548cb --- /dev/null +++ b/ui/src/api/User.ts @@ -0,0 +1,462 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import request, { ContentType, RequestParams } from "./httpClient"; +import { + DeleteDeleteAdminParams, + DeleteDeleteUserParams, + DomainAdminUser, + DomainCreateAdminReq, + DomainInviteResp, + DomainListAdminLoginHistoryResp, + DomainListAdminUserResp, + DomainListLoginHistoryResp, + DomainListUserResp, + DomainLoginReq, + DomainLoginResp, + DomainRegisterReq, + DomainSetting, + DomainUpdateSettingReq, + DomainUpdateUserReq, + DomainUser, + GetAdminLoginHistoryParams, + GetListAdminUserParams, + GetListUserParams, + GetLoginHistoryParams, + WebResp, +} from "./types"; + +/** + * @description 创建管理员 + * + * @tags User + * @name PostCreateAdmin + * @summary 创建管理员 + * @request POST:/api/v1/admin/create + * @response `200` `(WebResp & { + data?: DomainAdminUser, + +})` OK + */ + +export const postCreateAdmin = ( + param: DomainCreateAdminReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainAdminUser; + } + >({ + path: `/api/v1/admin/create`, + method: "POST", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 删除管理员 + * + * @tags User + * @name DeleteDeleteAdmin + * @summary 删除管理员 + * @request DELETE:/api/v1/admin/delete + * @response `200` `(WebResp & { + data?: Record, + +})` OK + */ + +export const deleteDeleteAdmin = ( + query: DeleteDeleteAdminParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: Record; + } + >({ + path: `/api/v1/admin/delete`, + method: "DELETE", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取管理员用户列表 + * + * @tags User + * @name GetListAdminUser + * @summary 获取管理员用户列表 + * @request GET:/api/v1/admin/list + * @response `200` `(WebResp & { + data?: DomainListAdminUserResp, + +})` OK + */ + +export const getListAdminUser = ( + query: GetListAdminUserParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListAdminUserResp; + } + >({ + path: `/api/v1/admin/list`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 管理员登录 + * + * @tags User + * @name PostAdminLogin + * @summary 管理员登录 + * @request POST:/api/v1/admin/login + * @response `200` `(WebResp & { + data?: DomainAdminUser, + +})` OK + */ + +export const postAdminLogin = ( + param: DomainLoginReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainAdminUser; + } + >({ + path: `/api/v1/admin/login`, + method: "POST", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取管理员登录历史 + * + * @tags User + * @name GetAdminLoginHistory + * @summary 获取管理员登录历史 + * @request GET:/api/v1/admin/login-history + * @response `200` `(WebResp & { + data?: DomainListAdminLoginHistoryResp, + +})` OK + */ + +export const getAdminLoginHistory = ( + query: GetAdminLoginHistoryParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListAdminLoginHistoryResp; + } + >({ + path: `/api/v1/admin/login-history`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取系统设置 + * + * @tags User + * @name GetGetSetting + * @summary 获取系统设置 + * @request GET:/api/v1/admin/setting + * @response `200` `(WebResp & { + data?: DomainSetting, + +})` OK + */ + +export const getGetSetting = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainSetting; + } + >({ + path: `/api/v1/admin/setting`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 更新系统设置 + * + * @tags User + * @name PutUpdateSetting + * @summary 更新系统设置 + * @request PUT:/api/v1/admin/setting + * @response `200` `(WebResp & { + data?: DomainSetting, + +})` OK + */ + +export const putUpdateSetting = ( + param: DomainUpdateSettingReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainSetting; + } + >({ + path: `/api/v1/admin/setting`, + method: "PUT", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 下载VSCode插件 + * + * @tags User + * @name GetVsixDownload + * @summary 下载VSCode插件 + * @request GET:/api/v1/static/vsix + */ + +export const getVsixDownload = (params: RequestParams = {}) => + request({ + path: `/api/v1/static/vsix`, + method: "GET", + type: ContentType.Json, + ...params, + }); + +/** + * @description 删除用户 + * + * @tags User + * @name DeleteDeleteUser + * @summary 删除用户 + * @request DELETE:/api/v1/user/delete + * @response `200` `(WebResp & { + data?: Record, + +})` OK + */ + +export const deleteDeleteUser = ( + query: DeleteDeleteUserParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: Record; + } + >({ + path: `/api/v1/user/delete`, + method: "DELETE", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取用户邀请码 + * + * @tags User + * @name GetInvite + * @summary 获取用户邀请码 + * @request GET:/api/v1/user/invite + * @response `200` `(WebResp & { + data?: DomainInviteResp, + +})` OK + */ + +export const getInvite = (params: RequestParams = {}) => + request< + WebResp & { + data?: DomainInviteResp; + } + >({ + path: `/api/v1/user/invite`, + method: "GET", + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取用户列表 + * + * @tags User + * @name GetListUser + * @summary 获取用户列表 + * @request GET:/api/v1/user/list + * @response `200` `(WebResp & { + data?: DomainListUserResp, + +})` OK + */ + +export const getListUser = ( + query: GetListUserParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListUserResp; + } + >({ + path: `/api/v1/user/list`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 用户登录 + * + * @tags User + * @name PostLogin + * @summary 用户登录 + * @request POST:/api/v1/user/login + * @response `200` `(WebResp & { + data?: DomainLoginResp, + +})` OK + */ + +export const postLogin = (param: DomainLoginReq, params: RequestParams = {}) => + request< + WebResp & { + data?: DomainLoginResp; + } + >({ + path: `/api/v1/user/login`, + method: "POST", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 获取用户登录历史 + * + * @tags User + * @name GetLoginHistory + * @summary 获取用户登录历史 + * @request GET:/api/v1/user/login-history + * @response `200` `(WebResp & { + data?: DomainListLoginHistoryResp, + +})` OK + */ + +export const getLoginHistory = ( + query: GetLoginHistoryParams, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainListLoginHistoryResp; + } + >({ + path: `/api/v1/user/login-history`, + method: "GET", + query: query, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 注册用户 + * + * @tags User + * @name PostRegister + * @summary 注册用户 + * @request POST:/api/v1/user/register + * @response `200` `(WebResp & { + data?: DomainUser, + +})` OK + */ + +export const postRegister = ( + param: DomainRegisterReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainUser; + } + >({ + path: `/api/v1/user/register`, + method: "POST", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); + +/** + * @description 更新用户 + * + * @tags User + * @name PutUpdateUser + * @summary 更新用户 + * @request PUT:/api/v1/user/update + * @response `200` `(WebResp & { + data?: DomainUser, + +})` OK + */ + +export const putUpdateUser = ( + param: DomainUpdateUserReq, + params: RequestParams = {}, +) => + request< + WebResp & { + data?: DomainUser; + } + >({ + path: `/api/v1/user/update`, + method: "PUT", + body: param, + type: ContentType.Json, + format: "json", + ...params, + }); diff --git a/ui/src/api/httpClient.ts b/ui/src/api/httpClient.ts new file mode 100644 index 0000000..f57234d --- /dev/null +++ b/ui/src/api/httpClient.ts @@ -0,0 +1,219 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { message as Message } from '@c-x/ui'; +import type { + AxiosInstance, + AxiosRequestConfig, + HeadersDefaults, + ResponseType, +} from 'axios'; +import axios from 'axios'; + +export type QueryParamsType = Record; + +export interface FullRequestParams + extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseType; + /** request body */ + body?: unknown; +} + +export type RequestParams = Omit< + FullRequestParams, + 'body' | 'method' | 'query' | 'path' +>; + +export interface ApiConfig + extends Omit { + securityWorker?: ( + securityData: SecurityDataType | null + ) => Promise | AxiosRequestConfig | void; + secure?: boolean; + format?: ResponseType; +} + +export enum ContentType { + Json = 'application/json', + FormData = 'multipart/form-data', + UrlEncoded = 'application/x-www-form-urlencoded', + Text = 'text/plain', +} + +const redirectToLogin = () => { + const redirectAfterLogin = encodeURIComponent(location.href); + const search = `redirect=${redirectAfterLogin}`; + const pathname = '/login'; + window.location.href = `${pathname}?${search}`; +}; + +type ExtractDataProp = T extends { data?: infer U } ? U : never; + +export class HttpClient { + public instance: AxiosInstance; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig['securityWorker']; + private secure?: boolean; + private format?: ResponseType; + + constructor({ + securityWorker, + secure, + format, + ...axiosConfig + }: ApiConfig = {}) { + this.instance = axios.create({ + withCredentials: true, + ...axiosConfig, + baseURL: axiosConfig.baseURL || '', + }); + this.secure = secure; + this.format = format; + this.securityWorker = securityWorker; + this.instance.interceptors.response.use( + (resp) => { + if (resp.data.code === 0) { + return resp.data.data; + } else { + Message.error(resp.data.message); + return Promise.reject(resp.data.message); + } + }, + (err) => { + if (err?.response?.status === 401) { + Message.error('尚未登录'); + redirectToLogin(); + return; + } + // 手动取消请求 + if (err.code === 'ERR_CANCELED') { + return; + } + const msg = err?.response?.data?.message || err?.message; + Message.error(msg); + return Promise.reject(msg); + } + ); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected mergeRequestParams( + params1: AxiosRequestConfig, + params2?: AxiosRequestConfig + ): AxiosRequestConfig { + const method = params1.method || (params2 && params2.method); + + return { + ...this.instance.defaults, + ...params1, + ...(params2 || {}), + headers: { + ...((method && + this.instance.defaults.headers[ + method.toLowerCase() as keyof HeadersDefaults + ]) || + {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected stringifyFormItem(formItem: unknown) { + if (typeof formItem === 'object' && formItem !== null) { + return JSON.stringify(formItem); + } else { + return `${formItem}`; + } + } + + protected createFormData(input: Record): FormData { + return Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + const propertyContent: any[] = + property instanceof Array ? property : [property]; + + for (const formItem of propertyContent) { + const isFileType = formItem instanceof Blob || formItem instanceof File; + formData.append( + key, + isFileType ? formItem : this.stringifyFormItem(formItem) + ); + } + + return formData; + }, new FormData()); + } + + public request = async ({ + secure, + path, + type, + query, + format, + body, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === 'boolean' ? secure : this.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const responseFormat = format || this.format || undefined; + + if ( + type === ContentType.FormData && + body && + body !== null && + typeof body === 'object' + ) { + body = this.createFormData(body as Record); + } + + if ( + type === ContentType.Text && + body && + body !== null && + typeof body !== 'string' + ) { + body = JSON.stringify(body); + } + + return this.instance.request({ + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData + ? { 'Content-Type': type } + : {}), + }, + params: query, + responseType: responseFormat, + data: body, + url: path, + }); + }; +} +export default new HttpClient({ format: 'json' }).request; diff --git a/ui/src/api/index.ts b/ui/src/api/index.ts new file mode 100644 index 0000000..482f2a8 --- /dev/null +++ b/ui/src/api/index.ts @@ -0,0 +1,7 @@ +export * from './Billing' +export * from './Dashboard' +export * from './Model' +export * from './OpenAiv1' +export * from './User' +export * from './types' + diff --git a/ui/src/api/types.ts b/ui/src/api/types.ts new file mode 100644 index 0000000..a99dc4b --- /dev/null +++ b/ui/src/api/types.ts @@ -0,0 +1,632 @@ +/* eslint-disable */ +/* tslint:disable */ +// @ts-nocheck +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export enum ConstsUserStatus { + UserStatusActive = "active", + UserStatusInactive = "inactive", + UserStatusLocked = "locked", +} + +export enum ConstsModelType { + ModelTypeLLM = "llm", + ModelTypeCoder = "coder", + ModelTypeEmbedding = "embedding", + ModelTypeAudio = "audio", + ModelTypeReranker = "reranker", +} + +export enum ConstsModelStatus { + ModelStatusActive = "active", + ModelStatusInactive = "inactive", +} + +export enum ConstsAdminStatus { + AdminStatusActive = "active", + AdminStatusInactive = "inactive", +} + +export interface DomainAdminLoginHistory { + /** 客户端版本 */ + client_version?: string; + /** 登录时间 */ + created_at?: number; + /** 设备信息 */ + device?: string; + /** IP信息 */ + ip_info?: DomainIPInfo; + /** 用户信息 */ + user?: DomainAdminUser; +} + +export interface DomainAdminUser { + /** 创建时间 */ + created_at?: number; + /** 用户ID */ + id?: string; + /** 最后活跃时间 */ + last_active_at?: number; + /** 用户状态 active: 正常 inactive: 禁用 */ + status?: ConstsAdminStatus; + /** 用户名 */ + username?: string; +} + +export interface DomainAllModelResp { + /** 提供商列表 */ + providers?: DomainProviderModel[]; +} + +export interface DomainCategoryPoint { + /** 分类 */ + category?: string; + /** 值 */ + value?: number; +} + +export interface DomainCategoryStat { + /** 编程语言占比 */ + program_language?: DomainCategoryPoint[]; + /** 工作模式占比 */ + work_mode?: DomainCategoryPoint[]; +} + +export interface DomainChatInfo { + content?: string; + created_at?: number; + id?: string; +} + +export interface DomainChatRecord { + /** 创建时间 */ + created_at?: number; + /** 记录ID */ + id?: string; + /** 输入token */ + input_tokens?: number; + /** 模型 */ + model?: DomainModel; + /** 输出token */ + output_tokens?: number; + /** 问题 */ + question?: string; + /** 用户 */ + user?: DomainUser; + /** 工作模式 */ + work_mode?: string; +} + +export interface DomainCheckModelReq { + /** 接口地址 */ + api_base: string; + /** 接口密钥 */ + api_key: string; + /** 模型名称 */ + model_name: string; + /** 提供商 */ + provider: string; +} + +export interface DomainCompletionInfo { + content?: string; + created_at?: number; + id?: string; +} + +export interface DomainCompletionRecord { + /** 创建时间 */ + created_at?: number; + /** 记录ID */ + id?: string; + /** 输入token */ + input_tokens?: number; + /** 是否采纳 */ + is_accept?: boolean; + /** 输出token */ + output_tokens?: number; + /** 编程语言 */ + program_language?: string; + /** 用户 */ + user?: DomainUser; +} + +export interface DomainCreateAdminReq { + /** 密码 */ + password?: string; + /** 用户名 */ + username?: string; +} + +export interface DomainCreateModelReq { + /** 接口地址 如:https://api.qwen.com */ + api_base?: string; + /** 接口密钥 如:sk-xxxx */ + api_key?: string; + /** 模型名称 如: deepseek-v3 */ + model_name?: string; + /** 模型类型 llm:对话模型 coder:代码模型 */ + model_type?: ConstsModelType; + /** 提供商 */ + provider?: string; +} + +export interface DomainIPInfo { + /** ASN */ + asn?: string; + /** 城市 */ + city?: string; + /** 国家 */ + country?: string; + /** IP地址 */ + ip?: string; + /** 运营商 */ + isp?: string; + /** 省份 */ + province?: string; +} + +export interface DomainInviteResp { + /** 邀请码 */ + code?: string; +} + +export interface DomainListAdminLoginHistoryResp { + has_next_page?: boolean; + login_histories?: DomainAdminLoginHistory[]; + next_token?: string; + total_count?: number; +} + +export interface DomainListAdminUserResp { + has_next_page?: boolean; + next_token?: string; + total_count?: number; + users?: DomainAdminUser[]; +} + +export interface DomainListChatRecordResp { + has_next_page?: boolean; + next_token?: string; + records?: DomainChatRecord[]; + total_count?: number; +} + +export interface DomainListCompletionRecordResp { + has_next_page?: boolean; + next_token?: string; + records?: DomainCompletionRecord[]; + total_count?: number; +} + +export interface DomainListLoginHistoryResp { + has_next_page?: boolean; + login_histories?: DomainUserLoginHistory[]; + next_token?: string; + total_count?: number; +} + +export interface DomainListUserResp { + has_next_page?: boolean; + next_token?: string; + total_count?: number; + users?: DomainUser[]; +} + +export interface DomainLoginReq { + /** 密码 */ + password?: string; + /** 会话Id */ + session_id?: string; + /** 用户名 */ + username?: string; +} + +export interface DomainLoginResp { + /** 重定向URL */ + redirect_url?: string; +} + +export interface DomainModel { + /** 接口地址 如:https://api.qwen.com */ + api_base?: string; + /** 接口密钥 如:sk-xxxx */ + api_key?: string; + /** 创建时间 */ + created_at?: number; + /** 模型ID */ + id?: string; + /** 输入token数 */ + input?: number; + /** 是否启用 */ + is_active?: boolean; + /** 模型名称 如: deepseek-v3 */ + model_name?: string; + /** 模型类型 llm:对话模型 coder:代码模型 */ + model_type?: ConstsModelType; + /** 输出token数 */ + output?: number; + /** 提供商 */ + provider?: string; + /** 状态 active:启用 inactive:禁用 */ + status?: ConstsModelStatus; + /** 更新时间 */ + updated_at?: number; +} + +export interface DomainModelBasic { + /** 接口地址 如:https://api.qwen.com */ + api_base?: string; + /** 模型名称 */ + name?: string; + /** 提供商 */ + provider?: string; +} + +export interface DomainModelData { + api_base?: string; + base_model?: string; + created?: number; + id?: string; + is_active?: boolean; + name?: string; + object?: string; + owned_by?: string; + type?: string; +} + +export interface DomainModelListResp { + data?: DomainModelData[]; + object?: string; +} + +export interface DomainModelTokenUsage { + /** 时间戳 */ + timestamp?: number; + /** 使用token数 */ + tokens?: number; +} + +export interface DomainModelTokenUsageResp { + /** 输入token使用记录 */ + input_usage?: DomainModelTokenUsage[]; + /** 输出token使用记录 */ + output_usage?: DomainModelTokenUsage[]; + /** 总输入token数 */ + total_input?: number; + /** 总输出token数 */ + total_output?: number; +} + +export interface DomainProviderModel { + /** 模型列表 */ + models?: DomainModelBasic[]; + /** 提供商 */ + provider?: string; +} + +export interface DomainRegisterReq { + /** 邀请码 */ + code?: string; + /** 邮箱 */ + email?: string; + /** 密码 */ + password?: string; +} + +export interface DomainSetting { + /** 创建时间 */ + created_at?: number; + /** 是否禁用密码登录 */ + disable_password_login?: boolean; + /** 是否开启SSO */ + enable_sso?: boolean; + /** 是否强制两步验证 */ + force_two_factor_auth?: boolean; + /** 更新时间 */ + updated_at?: number; +} + +export interface DomainStatistics { + /** 禁用用户数 */ + disabled_users?: number; + /** 总用户数 */ + total_users?: number; +} + +export interface DomainTimeStat { + /** 接受率统计 */ + accepted_per?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 活跃用户数统计 */ + active_users?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 对话任务数统计 */ + chats?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 补全任务数统计 */ + code_completions?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 代码行数统计 */ + lines_of_code?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 实时token数统计 */ + real_time_tokens?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 近90天平均接受率 */ + total_accepted_per?: number; + /** 近90天对话任务数 */ + total_chats?: number; + /** 近90天补全任务数 */ + total_completions?: number; + /** 近90天代码行数 */ + total_lines_of_code?: number; + /** 近90天活跃用户数 */ + total_users?: number; +} + +export interface DomainUpdateModelReq { + /** 接口地址 如:https://api.qwen.com */ + api_base?: string; + /** 接口密钥 如:sk-xxxx */ + api_key?: string; + /** 模型ID */ + id?: string; + /** 模型名称 */ + model_name?: string; + /** 提供商 */ + provider?: string; + /** 状态 active:启用 inactive:禁用 */ + status?: ConstsModelStatus; +} + +export interface DomainUpdateSettingReq { + /** 是否禁用密码登录 */ + disable_password_login?: boolean; + /** 是否开启SSO */ + enable_sso?: boolean; + /** 是否强制两步验证 */ + force_two_factor_auth?: boolean; +} + +export interface DomainUpdateUserReq { + /** 用户ID */ + id: string; + /** 重置密码 */ + password?: string; + /** 用户状态 active: 正常 locked: 锁定 inactive: 禁用 */ + status?: ConstsUserStatus; +} + +export interface DomainUser { + /** 创建时间 */ + created_at?: number; + /** 邮箱 */ + email?: string; + /** 用户ID */ + id?: string; + /** 最后活跃时间 */ + last_active_at?: number; + /** 用户状态 active: 正常 locked: 锁定 inactive: 禁用 */ + status?: ConstsUserStatus; + /** 是否开启两步验证 */ + two_step_auth?: boolean; + /** 用户名 */ + username?: string; +} + +export interface DomainUserCodeRank { + /** 代码行数 */ + lines?: number; + /** 用户名 */ + username?: string; +} + +export interface DomainUserEvent { + /** 事件时间 */ + created_at?: number; + /** 事件名称 */ + name?: string; +} + +export interface DomainUserHeatmap { + count?: number; + date?: number; +} + +export interface DomainUserHeatmapResp { + max_count?: number; + points?: DomainUserHeatmap[]; +} + +export interface DomainUserLoginHistory { + /** 客户端版本 */ + client_version?: string; + /** 登录时间 */ + created_at?: number; + /** 设备信息 */ + device?: string; + /** IP信息 */ + ip_info?: DomainIPInfo; + /** 用户信息 */ + user?: DomainUser; +} + +export interface DomainUserStat { + /** 接受率统计 */ + accepted_per?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 对话任务数统计 */ + chats?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 补全任务数统计 */ + code_completions?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 代码行数统计 */ + lines_of_code?: { + /** 时间戳 */ + timestamp?: number; + /** 值 */ + value?: number; + }[]; + /** 编程语言占比 */ + program_language?: DomainCategoryPoint[]; + /** 近90天总接受率 */ + total_accepted_per?: number; + /** 近90天总对话任务数 */ + total_chats?: number; + /** 近90天总补全任务数 */ + total_completions?: number; + /** 近90天总代码行数 */ + total_lines_of_code?: number; + /** 工作模式占比 */ + work_mode?: DomainCategoryPoint[]; +} + +export interface WebResp { + code?: number; + data?: unknown; + message?: string; +} + +export interface DeleteDeleteAdminParams { + /** 管理员ID */ + id: string; +} + +export interface GetListAdminUserParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} + +export interface GetAdminLoginHistoryParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} + +export interface GetChatInfoParams { + /** 对话记录ID */ + id: string; +} + +export interface GetListChatRecordParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} + +export interface GetCompletionInfoParams { + /** 补全记录ID */ + id: string; +} + +export interface GetListCompletionRecordParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} + +export interface GetUserEventsDashboardParams { + /** 用户ID */ + user_id: string; +} + +export interface GetUserHeatmapDashboardParams { + /** 用户ID */ + user_id: string; +} + +export interface GetUserStatDashboardParams { + /** 用户ID */ + user_id?: string; +} + +export interface GetMyModelListParams { + /** 模型类型 llm:对话模型 coder:代码模型 */ + model_type?: "llm" | "coder" | "embedding" | "audio" | "reranker"; +} + +export interface GetGetTokenUsageParams { + /** 模型类型 llm:对话模型 coder:代码模型 */ + model_type: "llm" | "coder" | "embedding" | "audio" | "reranker"; +} + +export interface DeleteDeleteUserParams { + /** 用户ID */ + id: string; +} + +export interface GetListUserParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} + +export interface GetLoginHistoryParams { + /** 下一页标识 */ + next_token?: string; + /** 分页 */ + page?: number; + /** 每页多少条记录 */ + size?: number; +} diff --git a/ui/src/assets/fonts/iconfont.js b/ui/src/assets/fonts/iconfont.js new file mode 100644 index 0000000..1105d37 --- /dev/null +++ b/ui/src/assets/fonts/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4940939='',(c=>{var a=(l=(l=document.getElementsByTagName("script"))[l.length-1]).getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,e,h,n=function(a,l){l.parentNode.insertBefore(a,l)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}t=function(){var a,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_4940939,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?n(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,e=c.document,h=!1,d(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,m())})}function m(){h||(h=!0,i())}function d(){try{e.documentElement.doScroll("left")}catch(a){return void setTimeout(d,50)}m()}})(window); \ No newline at end of file diff --git a/ui/src/assets/images/logo.png b/ui/src/assets/images/logo.png new file mode 100644 index 0000000..78ff535 Binary files /dev/null and b/ui/src/assets/images/logo.png differ diff --git a/ui/src/assets/images/nodata.png b/ui/src/assets/images/nodata.png new file mode 100644 index 0000000..8a289bd Binary files /dev/null and b/ui/src/assets/images/nodata.png differ diff --git a/ui/src/assets/images/qrcode.png b/ui/src/assets/images/qrcode.png new file mode 100644 index 0000000..803314a Binary files /dev/null and b/ui/src/assets/images/qrcode.png differ diff --git a/ui/src/assets/json/coin.json b/ui/src/assets/json/coin.json new file mode 100644 index 0000000..ee6cf33 --- /dev/null +++ b/ui/src/assets/json/coin.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"system-regular-103-coin-cash-monetization","ddd":0,"assets":[{"id":"comp_1","nm":"hover-coin","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[250.75,442.5,0],"to":[0,0.018,0],"ti":[0,-0.087,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[250.75,442.667,0],"to":[0,0.287,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[250.75,443.5,0],"to":[0,0,0],"ti":[0,0.287,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[250.75,442.667,0],"to":[0,-0.087,0],"ti":[0,0.018,0]},{"t":22,"s":[250.75,442.5,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,347,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[167.25,-195],[167.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.125,-195],[149.875,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-149.208,-195],[-128.458,-195]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-166.75,-195],[-166.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,153.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[167.25,-195],[167.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.125,-195],[149.875,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-149.208,-195],[-128.458,-195]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-166.75,-195],[-166.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,250.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[193.25,-195],[193.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.792,-195],[171.542,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-170.875,-195],[-150.125,-195]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-192.75,-195],[-192.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[250.75,57.5,0],"to":[0,-0.018,0],"ti":[0,0.087,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[250.75,57.333,0],"to":[0,-0.287,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[250.75,56.5,0],"to":[0,0,0],"ti":[0,-0.287,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[250.75,57.333,0],"to":[0,0.087,0],"ti":[0,-0.018,0]},{"t":22,"s":[250.75,57.5,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.167,-20.808],[-10.167,20.863]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-60.999,-20.671],[-60.999,21]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.167,-20.808],[-10.167,20.863]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.162,197.938],[-10.162,239.61]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61,198.075],[-61,239.746]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.162,197.938],[-10.162,239.61]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-47.054,158.552],[-10.162,197.943],[26.731,158.552],[-18.148,102.248],[-47.054,60.227],[-10.162,20.859],[26.731,65.13]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0],[0,24.45],[0,22.661],[0,24.45],[0,0],[0,-24.45]],"o":[[0,24.45],[0,0],[0,-24.45],[0,-10.661],[0,-24.45],[0,0],[0,0]],"v":[[-60.999,158.689],[-61,198.08],[-61,158.689],[-60.999,102.385],[-60.999,60.364],[-61,20.995],[-61,65.266]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-47.054,158.552],[-10.162,197.943],[26.731,158.552],[-18.148,102.248],[-47.054,60.227],[-10.162,20.859],[26.731,65.13]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":11,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[150.425,109.397],[-10.166,302.106],[-170.757,109.397],[-10.166,-83.313]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,-106.43],[-0.001,0],[0,106.43],[0.001,0]],"o":[[0,106.43],[0.001,0],[0,-106.43],[-0.001,0]],"v":[[-61.001,109.534],[-61,302.243],[-60.998,109.534],[-61,-83.176]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[150.425,109.397],[-10.166,302.106],[-170.757,109.397],[-10.166,-83.313]],"c":true}]},{"t":22,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":3.668,"s":[100],"h":1},{"t":11,"s":[50],"h":1},{"t":18.33203125,"s":[50],"h":1}],"ix":2},"o":{"a":0,"k":90,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.5,-20.836],[10.5,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63.001,-20.836],[63.001,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.5,-20.836],[10.5,20.836]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.505,197.911],[10.505,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63,197.911],[63,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.505,197.911],[10.505,239.582]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-26.387,158.525],[10.505,197.915],[47.397,158.525],[2.519,102.221],[-26.387,60.2],[10.505,20.831],[47.397,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0],[0,24.45],[0,22.661],[0,24.45],[0,0],[0,-24.45]],"o":[[0,24.45],[0,0],[0,-24.45],[0,-10.661],[0,-24.45],[0,0],[0,0]],"v":[[63.001,158.525],[63,197.915],[63,158.525],[63.001,102.221],[63.001,60.2],[63,20.831],[63,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-26.387,158.525],[10.505,197.915],[47.397,158.525],[2.519,102.221],[-26.387,60.2],[10.505,20.831],[47.397,65.102]],"c":false}]},{"t":22,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":3.668,"s":[0],"h":1},{"t":11,"s":[100],"h":1},{"t":18.33203125,"s":[100],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3.668,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[171.091,109.369],[10.501,302.079],[-150.09,109.369],[10.501,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,-106.43],[-0.001,0],[0,106.43],[0.001,0]],"o":[[0,106.43],[0.001,0],[0,-106.43],[-0.001,0]],"v":[[62.999,109.369],[63,302.079],[63.002,109.369],[63,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18.332,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[171.091,109.369],[10.501,302.079],[-150.09,109.369],[10.501,-83.34]],"c":true}]},{"t":22,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"t":0,"s":[50],"h":1},{"t":3.668,"s":[50],"h":1},{"t":11,"s":[100],"h":1},{"t":18.33203125,"s":[100],"h":1}],"ix":2},"o":{"a":0,"k":-90,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":22,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[250.75,442.5,0],"to":[0,0.018,0],"ti":[0,-0.087,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[250.75,442.667,0],"to":[0,0.287,0],"ti":[0,0,0]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[250.75,443.5,0],"to":[0,0,0],"ti":[0,0.018,0]},{"t":60,"s":[250.75,442.5,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,347,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[167.25,-195],[167.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.125,-195],[149.875,-195]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-166.75,-195],[-166.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,153.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[167.25,-195],[167.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.125,-195],[149.875,-195]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-166.75,-195],[-166.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.75,250.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[193.25,-195],[193.25,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[150.792,-195],[171.542,-195]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-192.75,-195],[-192.75,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[250.75,57.5,0],"to":[0,-0.018,0],"ti":[0,0.087,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[250.75,57.333,0],"to":[0,-0.287,0],"ti":[0,0,0]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[250.75,56.5,0],"to":[0,0,0],"ti":[0,-0.018,0]},{"t":60,"s":[250.75,57.5,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0.75,-195,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-9.417,-195],[10.917,-195]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61.5,-195],[63,-195]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1,-195],[0.5,-195]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.167,-20.808],[-10.167,20.863]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-60.999,-20.671],[-60.999,21]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-10.162,197.938],[-10.162,239.61]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-61,198.075],[-61,239.746]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-47.054,158.552],[-10.162,197.943],[26.731,158.552],[-18.148,102.248],[-47.054,60.227],[-10.162,20.859],[26.731,65.13]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0],[0,24.45],[0,22.661],[0,24.45],[0,0],[0,-24.45]],"o":[[0,24.45],[0,0],[0,-24.45],[0,-10.661],[0,-24.45],[0,0],[0,0]],"v":[[-60.999,158.689],[-61,198.08],[-61,158.689],[-60.999,102.385],[-60.999,60.364],[-61,20.995],[-61,65.266]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":22,"s":[100],"h":1},{"t":31.5,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[150.425,109.397],[-10.166,302.106],[-170.757,109.397],[-10.166,-83.313]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,-106.43],[-0.001,0],[0,106.43],[0.001,0]],"o":[[0,106.43],[0.001,0],[0,-106.43],[-0.001,0]],"v":[[-61.001,109.534],[-61,302.243],[-60.998,109.534],[-61,-83.176]],"c":true}]},{"t":60,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"t":22,"s":[100],"h":1},{"t":25.324,"s":[100],"h":1},{"t":31.5,"s":[50],"h":1}],"ix":2},"o":{"a":0,"k":90,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.5,-20.836],[10.5,20.836]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63.001,-20.836],[63.001,20.836]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-20.836],[0,20.836]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.505,197.911],[10.505,239.582]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[63,197.911],[63,239.582]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.006,197.911],[0.006,239.582]],"c":false}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,0],[-20.375,0],[0,24.45],[31.566,22.661],[0,24.45],[-20.375,0],[0,-24.45]],"o":[[0,24.45],[20.375,0],[0,-24.45],[-14.85,-10.661],[0,-24.45],[20.375,0],[0,0]],"v":[[-26.387,158.525],[10.505,197.915],[47.397,158.525],[2.519,102.221],[-26.387,60.2],[10.505,20.831],[47.397,65.102]],"c":false}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,0],[0,0],[0,24.45],[0,22.661],[0,24.45],[0,0],[0,-24.45]],"o":[[0,24.45],[0,0],[0,-24.45],[0,-10.661],[0,-24.45],[0,0],[0,0]],"v":[[63.001,158.525],[63,197.915],[63,158.525],[63.001,102.221],[63.001,60.2],[63,20.831],[63,65.102]],"c":false}]},{"t":60,"s":[{"i":[[0,0],[-24.45,0],[0,24.45],[37.879,22.661],[0,24.45],[-24.45,0],[0,-24.45]],"o":[[0,24.45],[24.45,0],[0,-24.45],[-17.82,-10.661],[0,-24.45],[24.45,0],[0,0]],"v":[[-44.265,158.525],[0.006,197.915],[44.277,158.525],[-9.578,102.221],[-44.265,60.2],[0.006,20.831],[44.277,65.102]],"c":false}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":22,"s":[0],"h":1},{"t":25.324,"s":[0],"h":1},{"t":31.5,"s":[100],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.324,"s":[{"i":[[0,-106.43],[88.692,0],[0,106.43],[-88.692,0]],"o":[[0,106.43],[-88.692,0],[0,-106.43],[88.692,0]],"v":[[171.091,109.369],[10.501,302.079],[-150.09,109.369],[10.501,-83.34]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0.167},"t":31.5,"s":[{"i":[[0,-106.43],[-0.001,0],[0,106.43],[0.001,0]],"o":[[0,106.43],[0.001,0],[0,-106.43],[-0.001,0]],"v":[[62.999,109.369],[63,302.079],[63.002,109.369],[63,-83.34]],"c":true}]},{"t":60,"s":[{"i":[[0,-106.43],[106.43,0],[0,106.43],[-106.43,0]],"o":[[0,106.43],[-106.43,0],[0,-106.43],[106.43,0]],"v":[[192.71,109.369],[0.001,302.079],[-192.709,109.369],[0.001,-83.34]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,140.63],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"t":22,"s":[50],"h":1},{"t":25.324,"s":[50],"h":1},{"t":31.5,"s":[100],"h":1}],"ix":2},"o":{"a":0,"k":-90,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":60,"st":1,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.186,0.025],[-0.025,0],[-0.022,0],[0,-15.761],[-8.644,0],[0,8.643],[25.476,6.899],[0,0],[8.644,0],[0,-8.643],[0,0],[0,-26.851],[-16.456,-9.535],[-1.805,-1.08],[0,0],[0,-14.091],[13.187,-0.023],[0.025,0],[0.025,0],[0,17.49],[8.644,0],[0,-8.643],[-26.389,-5.847],[0,0],[-8.644,0],[0,8.643],[0,0],[0,26.864],[11.729,11.188],[19.101,11.424],[0,0],[1.892,1.096],[0,12.245]],"o":[[0.025,0],[0.022,0],[15.753,0.033],[0,8.643],[8.644,0],[0,-27.629],[0,0],[0,-8.643],[-8.644,0],[0,0],[-26.386,5.846],[0,30.906],[1.768,1.024],[0,0],[37.853,22.64],[0,17.49],[-0.025,0],[-0.025,0],[-13.187,-0.023],[0,-8.643],[-8.644,0],[0,26.864],[0,0],[0,8.643],[8.644,0],[0,0],[26.389,-5.847],[0,-15.958],[-9.731,-9.283],[0,0],[-1.932,-1.155],[-15.848,-9.183],[0,-17.472]],"v":[[-0.079,-72.891],[-0.005,-72.888],[0.061,-72.891],[28.621,-44.271],[44.271,-28.621],[59.921,-44.271],[15.645,-102.107],[15.645,-130.209],[-0.005,-145.859],[-15.656,-130.209],[-15.656,-102.519],[-59.921,-49.174],[-22.985,3.135],[-17.618,6.278],[-15.969,7.264],[28.621,49.151],[0.075,72.891],[0,72.887],[-0.074,72.891],[-28.621,49.151],[-44.271,33.501],[-59.921,49.151],[-15.65,102.519],[-15.65,130.209],[0,145.859],[15.651,130.209],[15.651,102.519],[59.921,49.151],[42.73,9.364],[0.097,-19.598],[-1.548,-20.583],[-7.292,-23.947],[-28.621,-49.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[250.003,250.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[97.631,0],[0,97.631],[-97.631,0],[0,-97.631]],"o":[[-97.631,0],[0,-97.631],[97.631,0],[0,97.631]],"v":[[0,177.059],[-177.059,0],[0,-177.059],[177.059,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[114.89,0],[0,-114.89],[-114.89,0],[0,114.89]],"o":[[-114.89,0],[0,114.89],[114.89,0],[0,-114.89]],"v":[[0,-208.359],[-208.359,0],[0,208.359],[208.359,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,249.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1,"st":-60,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.998,249.999,0],"ix":2,"l":2},"a":{"a":0,"k":[249.998,249.999,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-13.186,0.025],[-0.025,0],[-0.022,0],[0,-15.761],[-8.644,0],[0,8.643],[25.476,6.899],[0,0],[8.644,0],[0,-8.643],[0,0],[0,-26.851],[-16.456,-9.535],[-1.805,-1.08],[0,0],[0,-14.091],[13.187,-0.023],[0.025,0],[0.025,0],[0,17.49],[8.644,0],[0,-8.643],[-26.389,-5.847],[0,0],[-8.644,0],[0,8.643],[0,0],[0,26.864],[11.729,11.188],[19.101,11.424],[0,0],[1.892,1.096],[0,12.245]],"o":[[0.025,0],[0.022,0],[15.753,0.033],[0,8.643],[8.644,0],[0,-27.629],[0,0],[0,-8.643],[-8.644,0],[0,0],[-26.386,5.846],[0,30.906],[1.768,1.024],[0,0],[37.853,22.64],[0,17.49],[-0.025,0],[-0.025,0],[-13.187,-0.023],[0,-8.643],[-8.644,0],[0,26.864],[0,0],[0,8.643],[8.644,0],[0,0],[26.389,-5.847],[0,-15.958],[-9.731,-9.283],[0,0],[-1.932,-1.155],[-15.848,-9.183],[0,-17.472]],"v":[[-0.079,-72.891],[-0.005,-72.888],[0.061,-72.891],[28.621,-44.271],[44.271,-28.621],[59.921,-44.271],[15.645,-102.107],[15.645,-130.209],[-0.005,-145.859],[-15.656,-130.209],[-15.656,-102.519],[-59.921,-49.174],[-22.985,3.135],[-17.618,6.278],[-15.969,7.264],[28.621,49.151],[0.075,72.891],[0,72.887],[-0.074,72.891],[-28.621,49.151],[-44.271,33.501],[-59.921,49.151],[-15.65,102.519],[-15.65,130.209],[0,145.859],[15.651,130.209],[15.651,102.519],[59.921,49.151],[42.73,9.364],[0.097,-19.598],[-1.548,-20.583],[-7.292,-23.947],[-28.621,-49.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[250.003,250.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[97.631,0],[0,97.631],[-97.631,0],[0,-97.631]],"o":[[-97.631,0],[0,-97.631],[97.631,0],[0,97.631]],"v":[[0,177.059],[-177.059,0],[0,-177.059],[177.059,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[114.89,0],[0,-114.89],[-114.89,0],[0,114.89]],"o":[[-114.89,0],[0,114.89],[114.89,0],[0,-114.89]],"v":[[0,-208.359],[-208.359,0],[0,208.359],[208.359,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[249.998,249.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-regular-103-coin-cash-monetization').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":300,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"control","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"primary","np":3,"mn":"ADBE Color Control","ix":1,"en":1,"ef":[{"ty":2,"nm":"Color","mn":"ADBE Color Control-0001","ix":1,"v":{"a":0,"k":[0.196,0.282,0.949],"ix":1}}]}],"ip":0,"op":201,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"hover-coin","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":70,"st":0,"bm":0}],"markers":[{"tm":0,"cm":"default:hover-coin","dr":60}],"props":{}} \ No newline at end of file diff --git a/ui/src/assets/json/error.json b/ui/src/assets/json/error.json new file mode 100644 index 0000000..528d1bf --- /dev/null +++ b/ui/src/assets/json/error.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"system-solid-55-error","ddd":0,"assets":[{"id":"comp_1","nm":"mask-1","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.001,119.791,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.005,60],[0.005,60]],"c":false}]},{"t":33,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":52,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":46,"st":-14,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21.25,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27.5,"s":[30]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":33.75,"s":[-30]},{"t":46,"s":[0]}],"ix":10},"p":{"a":0,"k":[250.004,249.549,0],"ix":2,"l":2},"a":{"a":0,"k":[0,36,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.004,181.084],[0.011,180.916]],"c":false}]},{"t":33,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,52.084],[0,-52.084]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":42,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":46,"st":-14,"ct":1,"bm":0}]},{"id":"comp_3","nm":"mask-2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL 2","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":58,"s":[0]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[50,50,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[1,1,0.8],"y":[0,0,0]},"t":16,"s":[180,180,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":35,"s":[180,180,100]},{"t":58,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":47,"st":-1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.001,119.791,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[52]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":16,"s":[150]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.6],"y":[0]},"t":35,"s":[150]},{"t":48,"s":[52]}],"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primary.design","cl":"primary design","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17.25,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23.5,"s":[30]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-30]},{"t":42,"s":[0]}],"ix":10},"p":{"a":0,"k":[50.004,49.549,0],"ix":2,"l":2},"a":{"a":0,"k":[0,36,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,52.084],[0,-52.084]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":16,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.004,136.084],[0,-52.084]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0},"t":35,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.004,136.084],[0,-52.084]],"c":false}]},{"t":48,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,52.084],[0,-52.084]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[42]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":16,"s":[150]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.6],"y":[0]},"t":35,"s":[150]},{"t":48,"s":[42]}],"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":47,"st":-1,"ct":1,"bm":0}]},{"id":"comp_4","nm":"hover-error-4","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5,-4.791],[1.458,-1.042],[1.458,-0.625],[1.667,-0.417],[1.667,0],[4.791,5],[0,6.875],[-5,4.791],[-8.541,-1.667],[-1.667,-0.833],[-1.25,-0.833],[-1.042,-1.25],[0,-6.875]],"o":[[-1.042,1.25],[-1.25,0.833],[-1.667,0.833],[-1.667,0.208],[-6.875,0],[-5,-4.791],[0,-6.875],[6.041,-6.041],[1.667,0.417],[1.458,0.625],[1.458,1.042],[5,4.791],[0,6.875]],"v":[[18.742,101.16],[14.784,104.493],[10.409,106.785],[5.409,108.451],[0.41,108.868],[-17.923,101.16],[-25.63,82.828],[-17.923,64.496],[5.409,57.205],[10.409,58.871],[14.784,61.163],[18.742,64.496],[26.449,82.828]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"o":[[0,-11.458],[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0]],"v":[[-20.422,-104.66],[0.41,-125.492],[21.241,-104.66],[21.241,-0.5],[0.41,20.332],[-20.422,-0.5]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[40.206,38.331],[55.621,-1.25],[38.331,-40.206],[-1.25,-55.621],[-40.206,-38.331],[-53.746,0],[0,0],[-38.331,40.206],[0,53.955],[0,0]],"o":[[-40.414,-38.331],[-55.621,1.458],[-38.331,40.414],[1.458,55.621],[39.164,37.289],[0,0],[55.621,-1.458],[37.289,-39.164],[0,0],[-1.458,-55.621]],"v":[[144.15,-151.323],[-4.59,-208.82],[-150.414,-144.241],[-207.91,4.5],[-143.331,150.323],[0.201,207.82],[5.409,207.82],[151.233,143.241],[208.729,-0.708],[208.729,-5.5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996,0.271,0.271,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-55-error').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5,-4.791],[1.458,-1.042],[1.458,-0.625],[1.667,-0.417],[1.667,0],[4.791,5],[0,6.875],[-5,4.791],[-8.541,-1.667],[-1.667,-0.833],[-1.25,-0.833],[-1.042,-1.25],[0,-6.875]],"o":[[-1.042,1.25],[-1.25,0.833],[-1.667,0.833],[-1.667,0.208],[-6.875,0],[-5,-4.791],[0,-6.875],[6.041,-6.041],[1.667,0.417],[1.458,0.625],[1.458,1.042],[5,4.791],[0,6.875]],"v":[[18.742,101.16],[14.784,104.493],[10.409,106.785],[5.409,108.451],[0.41,108.868],[-17.923,101.16],[-25.63,82.828],[-17.923,64.496],[5.409,57.205],[10.409,58.871],[14.784,61.163],[18.742,64.496],[26.449,82.828]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"o":[[0,-11.458],[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0]],"v":[[-20.422,-104.66],[0.41,-125.492],[21.241,-104.66],[21.241,-0.5],[0.41,20.332],[-20.422,-0.5]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[40.206,38.331],[55.621,-1.25],[38.331,-40.206],[-1.25,-55.621],[-40.206,-38.331],[-53.746,0],[0,0],[-38.331,40.206],[0,53.955],[0,0]],"o":[[-40.414,-38.331],[-55.621,1.458],[-38.331,40.414],[1.458,55.621],[39.164,37.289],[0,0],[55.621,-1.458],[37.289,-39.164],[0,0],[-1.458,-55.621]],"v":[[144.15,-151.323],[-4.59,-208.82],[-150.414,-144.241],[-207.91,4.5],[-143.331,150.323],[0.201,207.82],[5.409,207.82],[151.233,143.241],[208.729,-0.708],[208.729,-5.5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996,0.271,0.271,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-55-error').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"mask-3","td":1,"refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":1,"op":60,"st":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".primary.design","cl":"primary design","tt":2,"tp":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-180,"ix":10},"p":{"a":0,"k":[250.004,250.003,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.572,-106.399],[106.399,-2.572],[2.572,106.399],[-106.399,2.572]],"o":[[2.572,106.399],[-106.399,2.572],[-2.572,-106.399],[106.399,-2.572]],"v":[[192.652,-4.656],[4.656,192.652],[-192.652,4.656],[-4.656,-192.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.996,0.271,0.271,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-55-error').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":31.3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996,0.271,0.271,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-55-error').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"}],"ip":1,"op":60,"st":1,"ct":1,"bm":0}]},{"id":"comp_5","nm":"mask-3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.001,119.791,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":52,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":59,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6.25,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.5,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":19,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25.25,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[-30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37.25,"s":[30]},{"i":{"x":[0.16],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[-30]},{"t":55,"s":[0]}],"ix":10},"p":{"a":0,"k":[250.004,249.549,0],"ix":2,"l":2},"a":{"a":0,"k":[0,36,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,52.084],[0,-52.084]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":42,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":59,"st":-1,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"control","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"primary","np":3,"mn":"ADBE Color Control","ix":1,"en":1,"ef":[{"ty":2,"nm":"Color","mn":"ADBE Color Control-0001","ix":1,"v":{"a":0,"k":[0.996,0.271,0.271],"ix":1}}]}],"ip":0,"op":201,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"hover-error-4","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":70,"st":0,"bm":0}],"markers":[{"tm":0,"cm":"default:hover-error-4","dr":60}],"props":{}} \ No newline at end of file diff --git a/ui/src/assets/json/help-center.json b/ui/src/assets/json/help-center.json new file mode 100644 index 0000000..35a152a --- /dev/null +++ b/ui/src/assets/json/help-center.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"system-solid-140-help-center","ddd":0,"assets":[{"id":"comp_1","nm":"mask","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL ","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.439,"y":1},"o":{"x":0.167,"y":0.167},"t":0,"s":[162,302,0],"to":[0,0,0],"ti":[-37.439,48.859,0]},{"t":24,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[50,50,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":53,"st":-6,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.272},"t":21,"s":[49.998,105.168,0],"to":[0,12.667,0],"ti":[0,-8.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[49.998,181.168,0],"to":[0,8.167,0],"ti":[0,4.5,0]},{"t":53,"s":[49.998,154.168,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":52,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":53,"st":-6,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primary.design","cl":"primary design","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.997,13.545,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-16.638,10.184],[6.456,25.006],[18.009,4.654],[0,-34.168]],"o":[[0,0],[0,-19.508],[19.032,-11.65],[-4.65,-18.01],[-35.677,-9.221],[0,0]],"v":[[0,72.917],[0,72.878],[27.878,26.194],[51.635,-33.683],[14.251,-71.075],[-53.473,-19.445]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.322],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[100]},{"t":53,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":41,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17,"op":53,"st":-6,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".primary.design","cl":"primary design","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.997,13.545,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-16.638,10.184],[6.456,25.006],[18.009,4.654],[0,-34.168]],"o":[[0,0],[0,-19.508],[19.032,-11.65],[-4.65,-18.01],[-35.677,-9.221],[0,0]],"v":[[0,72.917],[0,72.878],[27.878,26.194],[51.635,-33.683],[14.251,-71.075],[-53.473,-19.445]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[0.722]},"o":{"x":[0.333],"y":[0]},"t":-2,"s":[100]},{"t":15,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"t":21,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":41,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":53,"st":-6,"ct":1,"bm":0}]},{"id":"comp_2","nm":"hover-help-center-3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.125,-17.292],[0,-11.25],[11.458,0],[0,11.458],[-23.75,14.583],[4.583,17.917],[10.833,2.708],[8.333,-6.458],[0,-10.208],[11.667,0],[0,11.458],[-18.333,14.167],[-22.917,-5.833],[-6.667,-25.208]],"o":[[-11.25,6.875],[0,11.458],[-11.458,0],[0,-25.833],[9.375,-5.833],[-2.708,-10.625],[-10.417,-2.708],[-8.125,6.25],[0,11.458],[-11.458,0],[0,-23.333],[18.333,-14.375],[25.417,6.458],[8.333,32.5]],"v":[[38.796,7.5],[20.879,36.458],[0.046,57.292],[-20.787,36.458],[17.129,-28.125],[31.504,-65],[9.004,-87.292],[-19.954,-81.667],[-32.662,-55.833],[-53.496,-35],[-74.329,-55.833],[-45.371,-114.583],[19.421,-127.708],[71.921,-75.417]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5,-4.792],[3.125,-1.25],[3.333,0],[4.792,5],[0,7.083],[-5,4.792],[-8.333,-1.667],[-1.667,-0.833],[-1.25,-0.833],[-1.25,-1.25],[0,-6.875]],"o":[[-2.5,2.5],[-3.125,1.458],[-6.875,0],[-5,-4.792],[0,-6.875],[5.833,-6.042],[1.667,0.417],[1.458,0.625],[1.458,1.042],[5,4.792],[0,6.875]],"v":[[18.379,122.5],[10.046,128.125],[0.046,130.208],[-18.287,122.5],[-25.996,104.167],[-18.287,85.833],[5.046,78.542],[10.046,80.208],[14.421,82.5],[18.379,85.833],[26.088,104.167]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[40.208,38.333],[55.417,-1.25],[38.333,-40.208],[-1.25,-55.625],[-40.208,-38.333],[-53.75,0],[0,0],[-38.333,40.208],[0,53.958],[0,0]],"o":[[-40.417,-38.333],[-55.625,1.458],[-38.333,40.417],[1.458,55.625],[39.167,37.292],[0,0],[55.625,-1.458],[37.292,-39.167],[0,0],[-1.458,-55.625]],"v":[[143.796,-150.833],[-4.954,-208.333],[-150.787,-143.75],[-208.287,5],[-143.704,150.833],[-0.162,208.333],[5.046,208.333],[150.879,143.75],[208.379,-0.208],[208.379,-5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1,"st":-59,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.125,-17.292],[0,-11.25],[11.458,0],[0,11.458],[-23.75,14.583],[4.583,17.917],[10.833,2.708],[8.333,-6.458],[0,-10.208],[11.667,0],[0,11.458],[-18.333,14.167],[-22.917,-5.833],[-6.667,-25.208]],"o":[[-11.25,6.875],[0,11.458],[-11.458,0],[0,-25.833],[9.375,-5.833],[-2.708,-10.625],[-10.417,-2.708],[-8.125,6.25],[0,11.458],[-11.458,0],[0,-23.333],[18.333,-14.375],[25.417,6.458],[8.333,32.5]],"v":[[38.796,7.5],[20.879,36.458],[0.046,57.292],[-20.787,36.458],[17.129,-28.125],[31.504,-65],[9.004,-87.292],[-19.954,-81.667],[-32.662,-55.833],[-53.496,-35],[-74.329,-55.833],[-45.371,-114.583],[19.421,-127.708],[71.921,-75.417]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5,-4.792],[3.125,-1.25],[3.333,0],[4.792,5],[0,7.083],[-5,4.792],[-8.333,-1.667],[-1.667,-0.833],[-1.25,-0.833],[-1.25,-1.25],[0,-6.875]],"o":[[-2.5,2.5],[-3.125,1.458],[-6.875,0],[-5,-4.792],[0,-6.875],[5.833,-6.042],[1.667,0.417],[1.458,0.625],[1.458,1.042],[5,4.792],[0,6.875]],"v":[[18.379,122.5],[10.046,128.125],[0.046,130.208],[-18.287,122.5],[-25.996,104.167],[-18.287,85.833],[5.046,78.542],[10.046,80.208],[14.421,82.5],[18.379,85.833],[26.088,104.167]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[40.208,38.333],[55.417,-1.25],[38.333,-40.208],[-1.25,-55.625],[-40.208,-38.333],[-53.75,0],[0,0],[-38.333,40.208],[0,53.958],[0,0]],"o":[[-40.417,-38.333],[-55.625,1.458],[-38.333,40.417],[1.458,55.625],[39.167,37.292],[0,0],[55.625,-1.458],[37.292,-39.167],[0,0],[-1.458,-55.625]],"v":[[143.796,-150.833],[-4.954,-208.333],[-150.787,-143.75],[-208.287,5],[-143.704,150.833],[-0.162,208.333],[5.046,208.333],[150.879,143.75],[208.379,-0.208],[208.379,-5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":59,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"mask","td":1,"refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":1,"op":59,"st":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".primary.design","cl":"primary design","tt":2,"tp":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.003,250.003,0],"ix":2,"l":2},"a":{"a":0,"k":[250.003,250.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[114.89,0],[0,114.89],[-114.89,0],[0,-114.89]],"o":[[-114.89,0],[0,-114.89],[114.89,0],[0,114.89]],"v":[[0.001,208.359],[-208.36,0],[0.001,-208.359],[208.36,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[250.003,250.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":59,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"mask","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.997,213.545,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-16.638,10.184],[6.456,25.006],[18.009,4.654],[0,-34.168]],"o":[[0,0],[0,-19.508],[19.032,-11.65],[-4.65,-18.01],[-35.677,-9.221],[0,0]],"v":[[0,72.917],[0,72.878],[27.878,26.194],[51.635,-33.683],[14.251,-71.075],[-53.473,-19.445]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":26,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":41,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":58,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[249.997,213.545,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-16.638,10.184],[6.456,25.006],[18.009,4.654],[0,-34.168]],"o":[[0,0],[0,-19.508],[19.032,-11.65],[-4.65,-18.01],[-35.677,-9.221],[0,0]],"v":[[0,72.917],[0,72.878],[27.878,26.194],[51.635,-33.683],[14.251,-71.075],[-53.473,-19.445]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.29],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[100]},{"t":58,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":41,"ix":5},"lc":2,"lj":2,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":58,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.25,"y":1},"o":{"x":0.333,"y":0},"t":22,"s":[249.998,354.168,0],"to":[0,4.5,0],"ti":[0,0,0]},{"i":{"x":0.149,"y":1},"o":{"x":0.333,"y":0},"t":33.127,"s":[249.998,381.168,0],"to":[0,0,0],"ti":[0,4.5,0]},{"t":58,"s":[249.998,354.168,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":3,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-140-help-center').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":52,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Stroke","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":58,"st":-1,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"control","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"primary","np":3,"mn":"ADBE Color Control","ix":1,"en":1,"ef":[{"ty":2,"nm":"Color","mn":"ADBE Color Control-0001","ix":1,"v":{"a":0,"k":[0.196,0.282,0.949],"ix":1}}]}],"ip":0,"op":201,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"hover-help-center-3","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":70,"st":0,"bm":0}],"markers":[{"tm":0,"cm":"default:hover-help-center-3","dr":60}],"props":{}} \ No newline at end of file diff --git a/ui/src/assets/json/upgrade.json b/ui/src/assets/json/upgrade.json new file mode 100644 index 0000000..9001e1d --- /dev/null +++ b/ui/src/assets/json/upgrade.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":60,"w":500,"h":500,"nm":"system-solid-163-upgrade","ddd":0,"assets":[{"id":"comp_1","nm":"mask","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[250,333,0],"to":[0,-13.833,0],"ti":[0,13.833,0]},{"t":38,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[1.968,-4.892],[4.919,0],[0,0],[0,0],[6.764,0],[0,-0.029],[0,0],[0,0],[1.845,5.024],[-3.443,3.834],[0,0],[-1.476,0.661],[-0.615,0],[-1.107,0],[-0.984,-0.397],[-0.611,-0.274],[-1.107,-1.19],[0,0]],"o":[[-1.845,5.024],[0,0],[0,0],[0,-0.029],[-6.764,0],[0,0],[0,0],[-4.919,0],[-1.968,-4.892],[0,0],[1.107,-1.19],[0.615,-0.264],[0.984,-0.397],[1.107,0],[0.615,0],[1.476,0.661],[0,0],[3.443,3.834]],"v":[[42.282,33.052],[30.969,41.25],[12.523,40.984],[12.397,40.986],[0.1,40.933],[-12.198,40.986],[-12.072,40.984],[-30.518,41.25],[-41.832,33.052],[-39.249,18.64],[-8.506,-14.416],[-4.571,-17.192],[-2.849,-17.721],[0.225,-18.25],[3.3,-17.721],[5.021,-17.192],[8.956,-14.416],[39.7,18.64]],"c":true}]},{"t":8,"s":[{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":38,"st":-22,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[3.88,0],[0,0],[0,3.88],[-3.88,0],[0,0],[0,-3.88]],"o":[[0,0],[-3.88,0],[0,-3.88],[0,0],[3.88,0],[0,3.88]],"v":[[1.437,110.667],[1.155,110.61],[-5.9,103.555],[1.155,96.5],[1.437,96.556],[8.492,103.612]],"c":true}]},{"i":{"x":0.09,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,-11.458]],"o":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"v":[[1.713,124.5],[0.879,124.333],[-19.954,103.5],[0.879,82.667],[1.713,82.833],[22.546,103.667]],"c":true}]},{"t":38,"s":[{"i":[[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,-11.458]],"o":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"v":[[41.713,124.5],[-41.621,124.5],[-62.454,103.667],[-41.621,82.833],[41.713,82.833],[62.546,103.667]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":38,"st":-58,"ct":1,"bm":0}]},{"id":"comp_2","nm":"hover-upgrade","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,-11.458]],"o":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"v":[[41.713,124.5],[-41.621,124.5],[-62.454,103.667],[-41.621,82.833],[41.713,82.833],[62.546,103.667]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[114.792,0],[0,-114.792],[-114.792,0],[0,114.792]],"o":[[-114.792,0],[0,114.792],[114.792,0],[0,-114.792]],"v":[[0.046,-208.833],[-208.287,-0.5],[0.046,207.833],[208.379,-0.5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,-11.458]],"o":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"v":[[41.713,124.5],[-41.621,124.5],[-62.454,103.667],[-41.621,82.833],[41.713,82.833],[62.546,103.667]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[114.792,0],[0,-114.792],[-114.792,0],[0,114.792]],"o":[[-114.792,0],[0,114.792],[114.792,0],[0,-114.792]],"v":[[0.046,-208.833],[-208.287,-0.5],[0.046,207.833],[208.379,-0.5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"mask","td":1,"refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":1,"op":60,"st":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".primary.design","cl":"primary design","tt":2,"tp":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.458,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,-11.458]],"o":[[0,0],[-11.458,0],[0,-11.458],[0,0],[11.458,0],[0,11.458]],"v":[[41.713,124.5],[-41.621,124.5],[-62.454,103.667],[-41.621,82.833],[41.713,82.833],[62.546,103.667]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[114.792,0],[0,-114.792],[-114.792,0],[0,114.792]],"o":[[-114.792,0],[0,114.792],[114.792,0],[0,-114.792]],"v":[[0.046,-208.833],[-208.287,-0.5],[0.046,207.833],[208.379,-0.5]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":60,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"mask","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":34,"s":[250,333,0],"to":[0,-13.833,0],"ti":[0,13.833,0]},{"t":59,"s":[250,250,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[{"i":[[1.968,-4.892],[4.919,0],[0,0],[0,0],[6.764,0],[0,-0.029],[0,0],[0,0],[1.845,5.024],[-3.443,3.834],[0,0],[-1.476,0.661],[-0.615,0],[-1.107,0],[-0.984,-0.397],[-0.611,-0.274],[-1.107,-1.19],[0,0]],"o":[[-1.845,5.024],[0,0],[0,0],[0,-0.029],[-6.764,0],[0,0],[0,0],[-4.919,0],[-1.968,-4.892],[0,0],[1.107,-1.19],[0.615,-0.264],[0.984,-0.397],[1.107,0],[0.615,0],[1.476,0.661],[0,0],[3.443,3.834]],"v":[[42.282,33.052],[30.969,41.25],[12.523,40.984],[12.397,40.986],[0.1,40.933],[-12.198,40.986],[-12.072,40.984],[-30.518,41.25],[-41.832,33.052],[-39.249,18.64],[-8.506,-14.416],[-4.571,-17.192],[-2.849,-17.721],[0.225,-18.25],[3.3,-17.721],[5.021,-17.192],[8.956,-14.416],[39.7,18.64]],"c":true}]},{"t":34,"s":[{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":59,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".primary.design","cl":"primary design","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.186,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[250,250,0],"to":[0,13.333,0],"ti":[0,-13.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":14,"s":[250,330,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[250,330,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[250,330,0],"to":[0,-64.167,0],"ti":[0,64.167,0]},{"t":30,"s":[250,-55,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.186,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":14,"s":[{"i":[[3.333,-6.653],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,6.833],[-5.833,5.215],[0,0],[-2.508,0.693],[-1.042,0],[-1.875,0],[-1.667,-0.432],[-1.039,-0.299],[-1.875,-1.295],[0,0]],"o":[[-3.125,6.833],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-6.653],[0,0],[1.875,-1.295],[1.042,-0.288],[1.667,-0.432],[1.875,0],[1.042,0],[2.5,0.719],[0,0],[5.833,5.215]],"v":[[71.509,-14.399],[52.342,-3.25],[21.092,-3.25],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.575,-3.25],[-51.825,-3.25],[-70.992,-14.399],[-66.617,-34],[-14.533,-63.827],[-7.867,-66.849],[-4.95,-67.424],[0.258,-68],[5.467,-67.424],[8.384,-66.849],[15.05,-63.827],[67.133,-34]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[3.333,-6.653],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,6.833],[-5.833,5.215],[0,0],[-2.508,0.693],[-1.042,0],[-1.875,0],[-1.667,-0.432],[-1.039,-0.299],[-1.875,-1.295],[0,0]],"o":[[-3.125,6.833],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-6.653],[0,0],[1.875,-1.295],[1.042,-0.288],[1.667,-0.432],[1.875,0],[1.042,0],[2.5,0.719],[0,0],[5.833,5.215]],"v":[[71.509,-14.399],[52.342,-3.25],[21.092,-3.25],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.575,-3.25],[-51.825,-3.25],[-70.992,-14.399],[-66.617,-34],[-14.533,-63.827],[-7.867,-66.849],[-4.95,-67.424],[0.258,-68],[5.467,-67.424],[8.384,-66.849],[15.05,-63.827],[67.133,-34]],"c":true}]},{"t":20,"s":[{"i":[[3.333,-7.708],[8.333,0],[0,0],[0,0],[11.458,0],[0,11.458],[0,0],[0,0],[3.125,7.917],[-5.833,6.042],[0,0],[-2.5,1.042],[-1.042,0],[-1.875,0],[-1.667,-0.625],[-1.042,-0.417],[-1.875,-1.875],[0,0]],"o":[[-3.125,7.917],[0,0],[0,0],[0,11.458],[-11.458,0],[0,0],[0,0],[-8.333,0],[-3.333,-7.708],[0,0],[1.875,-1.875],[1.042,-0.417],[1.667,-0.625],[1.875,0],[1.042,0],[2.5,1.042],[0,0],[5.833,6.042]],"v":[[71.296,-44.667],[52.129,-31.75],[20.879,-31.75],[20.879,20.333],[0.046,41.167],[-20.787,20.333],[-20.787,-31.75],[-52.037,-31.75],[-71.204,-44.667],[-66.829,-67.375],[-14.746,-119.458],[-8.079,-123.833],[-5.162,-124.667],[0.046,-125.5],[5.254,-124.667],[8.171,-123.833],[14.838,-119.458],[66.921,-67.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196,0.282,0.949,1],"ix":4,"x":"var $bm_rt;\n$bm_rt = comp('system-solid-163-upgrade').layer('control').effect('primary')('Color');"},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":".primary","mn":"ADBE Vector Graphic - Fill","hd":false,"cl":"primary"},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":59,"st":-1,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"control","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"primary","np":3,"mn":"ADBE Color Control","ix":1,"en":1,"ef":[{"ty":2,"nm":"Color","mn":"ADBE Color Control-0001","ix":1,"v":{"a":0,"k":[0.196,0.282,0.949],"ix":1}}]}],"ip":0,"op":131,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"hover-upgrade","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":70,"st":0,"bm":0}],"markers":[{"tm":0,"cm":"default:hover-upgrade","dr":60}],"props":{}} \ No newline at end of file diff --git a/ui/src/assets/react.svg b/ui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/src/assets/styles/markdown.css b/ui/src/assets/styles/markdown.css new file mode 100644 index 0000000..916dc9e --- /dev/null +++ b/ui/src/assets/styles/markdown.css @@ -0,0 +1,1206 @@ +.markdown-body { + color-scheme: light; + --color-prettylights-syntax-comment: #6e7781; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #8250df; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-fg-default: #24292f; + --color-fg-h: #24292f; + --color-fg-muted: #57606a; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #fafafa; + --color-border-default: #eceef1; + --color-border-muted: #eceef1; + --color-neutral-muted: rgba(175, 184, 193, 0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #cf222e; + --color-primary-main: #206cff; +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + margin: 0; + color: var(--color-fg-default); + background-color: var(--color-canvas-default); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', + Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; + font-size: 14px; + line-height: 1.5; + word-wrap: break-word; + /* letter-spacing: 1px; */ +} + +.markdown-body .octicon { + display: inline-block; + fill: currentColor; + vertical-align: text-bottom; +} + +.markdown-body h1:hover .anchor .octicon-link:before, +.markdown-body h2:hover .anchor .octicon-link:before, +.markdown-body h3:hover .anchor .octicon-link:before, +.markdown-body h4:hover .anchor .octicon-link:before, +.markdown-body h5:hover .anchor .octicon-link:before, +.markdown-body h6:hover .anchor .octicon-link:before { + width: 16px; + height: 16px; + content: ' '; + display: inline-block; + background-color: currentColor; + -webkit-mask-image: url("data:image/svg+xml,"); + mask-image: url("data:image/svg+xml,"); +} + +.markdown-body details, +.markdown-body figcaption, +.markdown-body figure { + display: block; +} + +.markdown-body summary { + display: list-item; +} + +.markdown-body [hidden] { + display: none !important; +} + +.markdown-body a { + background-color: transparent; + color: var(--color-accent-fg); + text-decoration: none; +} + +.markdown-body abbr[title] { + border-bottom: none; + text-decoration: underline dotted; +} + +.markdown-body b, +.markdown-body strong { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dfn { + font-style: italic; +} + +.markdown-body h1 { + margin: 0.67em 0; + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body mark { + background-color: var(--color-attention-subtle); + color: var(--color-fg-default); +} + +.markdown-body small { + font-size: 90%; +} + +.markdown-body sub, +.markdown-body sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +.markdown-body sub { + bottom: -0.25em; +} + +.markdown-body sup { + top: -0.5em; +} + +.markdown-body img { + border-style: none; + max-width: 60%; + box-sizing: content-box; + background-color: var(--color-canvas-default); +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre, +.markdown-body samp { + font-family: monospace; + font-size: 1em; +} + +.markdown-body figure { + margin: 1em 40px; +} + +.markdown-body hr { + box-sizing: content-box; + overflow: hidden; + background: transparent; + border-bottom: 1px solid var(--color-border-muted); + height: 1px; + padding: 0; + margin: 24px 0; + background-color: var(--color-border-default); + border: 0; +} + +.markdown-body input { + font: inherit; + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body [type='button'], +.markdown-body [type='reset'], +.markdown-body [type='submit'] { + -webkit-appearance: button; +} + +.markdown-body [type='checkbox'], +.markdown-body [type='radio'] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body [type='number']::-webkit-inner-spin-button, +.markdown-body [type='number']::-webkit-outer-spin-button { + height: auto; +} + +.markdown-body [type='search']::-webkit-search-cancel-button, +.markdown-body [type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +.markdown-body ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +.markdown-body ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +.markdown-body a:hover { + text-decoration: underline; +} + +.markdown-body ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; +} + +.markdown-body hr::before { + display: table; + content: ''; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; + display: block; + width: max-content; + max-width: 100%; + overflow: auto; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body details summary { + cursor: pointer; +} + +.markdown-body details:not([open]) > *:not(summary) { + display: none !important; +} + +.markdown-body a:focus, +.markdown-body [role='button']:focus, +.markdown-body input[type='radio']:focus, +.markdown-body input[type='checkbox']:focus { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:focus:not(:focus-visible), +.markdown-body [role='button']:focus:not(:focus-visible), +.markdown-body input[type='radio']:focus:not(:focus-visible), +.markdown-body input[type='checkbox']:focus:not(:focus-visible) { + outline: solid 1px transparent; +} + +.markdown-body a:focus-visible, +.markdown-body [role='button']:focus-visible, +.markdown-body input[type='radio']:focus-visible, +.markdown-body input[type='checkbox']:focus-visible { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:not([class]):focus, +.markdown-body a:not([class]):focus-visible, +.markdown-body input[type='radio']:focus, +.markdown-body input[type='radio']:focus-visible, +.markdown-body input[type='checkbox']:focus, +.markdown-body input[type='checkbox']:focus-visible { + outline-offset: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + color: var(--color-fg-h); + margin-bottom: 16px; + font-weight: var(--base-text-weight-semibold, 600); + line-height: 1.25; +} + +.markdown-body h2 { + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: 0.3em; + font-size: 1.333em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body h3 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.167em; +} + +.markdown-body h4 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.167em; +} + +.markdown-body h5 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.167em; +} + +.markdown-body h6 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.167em; + color: var(--color-fg-muted); +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; + padding: 8px 1em; + color: var(--color-fg-subtle); + border-left: 1px solid var(--color-border-default); +} + +.markdown-body blockquote a { + color: var(--color-fg-subtle) !important; +} + +.markdown-body ul, +.markdown-body ol { + margin-top: 0; + margin-bottom: 0; + padding-left: 2em; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body tt, +.markdown-body code, +.markdown-body samp { + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + font-size: 12px; + word-wrap: normal; +} + +.markdown-body .octicon { + display: inline-block; + overflow: visible !important; + vertical-align: text-bottom; + fill: currentColor; +} + +.markdown-body input::-webkit-outer-spin-button, +.markdown-body input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + appearance: none; +} + +.markdown-body::before { + display: table; + content: ''; +} + +.markdown-body .ant-image { + display: block; +} + +.markdown-body::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body > *:first-child { + margin-top: 0 !important; +} + +.markdown-body > *:nth-child(2) { + margin-top: 0 !important; +} + +.markdown-body > *:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .absent { + color: var(--color-danger-fg); +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre, +.markdown-body center, +.markdown-body details { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body blockquote > :first-child { + margin-top: 0; +} + +.markdown-body blockquote > :last-child { + margin-bottom: 0; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: var(--color-fg-default); + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 tt, +.markdown-body h1 code, +.markdown-body h2 tt, +.markdown-body h2 code, +.markdown-body h3 tt, +.markdown-body h3 code, +.markdown-body h4 tt, +.markdown-body h4 code, +.markdown-body h5 tt, +.markdown-body h5 code, +.markdown-body h6 tt, +.markdown-body h6 code { + padding: 0 0.2em; + font-size: inherit; +} + +.markdown-body summary h1, +.markdown-body summary h2, +.markdown-body summary h3, +.markdown-body summary h4, +.markdown-body summary h5, +.markdown-body summary h6 { + display: inline-block; +} + +.markdown-body summary h1 .anchor, +.markdown-body summary h2 .anchor, +.markdown-body summary h3 .anchor, +.markdown-body summary h4 .anchor, +.markdown-body summary h5 .anchor, +.markdown-body summary h6 .anchor { + margin-left: -40px; +} + +.markdown-body summary h1, +.markdown-body summary h2 { + padding-bottom: 0; + border-bottom: 0; +} + +.markdown-body ul.no-list, +.markdown-body ol.no-list { + padding: 0; + list-style-type: none; +} + +.markdown-body ol[type='a'] { + list-style-type: lower-alpha; +} + +.markdown-body ol[type='A'] { + list-style-type: upper-alpha; +} + +.markdown-body ol[type='i'] { + list-style-type: lower-roman; +} + +.markdown-body ol[type='I'] { + list-style-type: upper-roman; +} + +.markdown-body ol[type='1'] { + list-style-type: decimal; +} + +.markdown-body div > ol:not([type]) { + list-style-type: decimal; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li > p { + margin-top: 16px; +} + +.markdown-body li + li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table th { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid var(--color-border-default); +} + +.markdown-body table thead tr { + background-color: var(--color-canvas-subtle); +} + +.markdown-body table tr { + background-color: var(--color-canvas-default); + border-top: 1px solid var(--color-border-muted); +} + +.markdown-body table tr:nth-child(2n) { + background-color: var(--color-canvas-subtle); +} + +.markdown-body table img { + background-color: transparent; +} + +.markdown-body img[align='right'] { + padding-left: 20px; +} + +.markdown-body img[align='left'] { + padding-right: 20px; +} + +.markdown-body .emoji { + max-width: none; + vertical-align: text-top; + background-color: transparent; +} + +.markdown-body span.frame { + display: block; + overflow: hidden; +} + +.markdown-body span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid var(--color-border-default); +} + +.markdown-body span.frame span img { + display: block; + float: left; +} + +.markdown-body span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: var(--color-fg-default); +} + +.markdown-body span.align-center { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; +} + +.markdown-body span.align-center span img { + margin: 0 auto; + text-align: center; +} + +.markdown-body span.align-right { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-right > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; +} + +.markdown-body span.align-right span img { + margin: 0; + text-align: right; +} + +.markdown-body span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; +} + +.markdown-body span.float-left span { + margin: 13px 0 0; +} + +.markdown-body span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; +} + +.markdown-body span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; +} + +.markdown-body code, +.markdown-body tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + white-space: break-spaces; + background-color: var(--color-neutral-muted); + border-radius: 6px; + background-color: #fff5f5; + color: #ff502c; +} + +.markdown-body code br, +.markdown-body tt br { + display: none; +} + +.markdown-body del code { + text-decoration: inherit; +} + +.markdown-body samp { + font-size: 85%; +} + +.markdown-body pre > code { + padding: 0; + margin: 0; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; + cursor: pointer; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: var(--color-canvas-subtle); + border-radius: 6px; +} + +.markdown-body pre code, +.markdown-body pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body .csv-data td, +.markdown-body .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; +} + +.markdown-body .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: var(--color-canvas-default); + border: 0; +} + +.markdown-body .csv-data tr { + border-top: 0; +} + +.markdown-body .csv-data th { + font-weight: var(--base-text-weight-semibold, 600); + background: var(--color-canvas-subtle); + border-top: 0; +} + +.markdown-body [data-footnote-ref]::before { + content: '['; +} + +.markdown-body [data-footnote-ref]::after { + content: ']'; +} + +.markdown-body .footnotes { + font-size: 12px; + color: var(--color-fg-muted); + border-top: 1px solid var(--color-border-default); +} + +.markdown-body .footnotes ol { + padding-left: 16px; +} + +.markdown-body .footnotes ol ul { + display: inline-block; + padding-left: 16px; + margin-top: 16px; +} + +.markdown-body .footnotes li { + position: relative; +} + +.markdown-body .footnotes li:target::before { + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -24px; + pointer-events: none; + content: ''; + border: 2px solid var(--color-accent-emphasis); + border-radius: 6px; +} + +.markdown-body .footnotes li:target { + color: var(--color-fg-default); +} + +.markdown-body .footnotes .data-footnote-backref g-emoji { + font-family: monospace; +} + +.markdown-body .pl-c { + color: var(--color-prettylights-syntax-comment); +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: var(--color-prettylights-syntax-constant); +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: var(--color-prettylights-syntax-entity); +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: var(--color-prettylights-syntax-storage-modifier-import); +} + +.markdown-body .pl-ent { + color: var(--color-prettylights-syntax-entity-tag); +} + +.markdown-body .pl-k { + color: var(--color-prettylights-syntax-keyword); +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: var(--color-prettylights-syntax-string); +} + +.markdown-body .pl-v, +.markdown-body .pl-smw { + color: var(--color-prettylights-syntax-variable); +} + +.markdown-body .pl-bu { + color: var(--color-prettylights-syntax-brackethighlighter-unmatched); +} + +.markdown-body .pl-ii { + color: var(--color-prettylights-syntax-invalid-illegal-text); + background-color: var(--color-prettylights-syntax-invalid-illegal-bg); +} + +.markdown-body .pl-c2 { + color: var(--color-prettylights-syntax-carriage-return-text); + background-color: var(--color-prettylights-syntax-carriage-return-bg); +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: var(--color-prettylights-syntax-string-regexp); +} + +.markdown-body .pl-ml { + color: var(--color-prettylights-syntax-markup-list); +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-heading); +} + +.markdown-body .pl-mi { + font-style: italic; + color: var(--color-prettylights-syntax-markup-italic); +} + +.markdown-body .pl-mb { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-bold); +} + +.markdown-body .pl-md { + color: var(--color-prettylights-syntax-markup-deleted-text); + background-color: var(--color-prettylights-syntax-markup-deleted-bg); +} + +.markdown-body .pl-mi1 { + color: var(--color-prettylights-syntax-markup-inserted-text); + background-color: var(--color-prettylights-syntax-markup-inserted-bg); +} + +.markdown-body .pl-mc { + color: var(--color-prettylights-syntax-markup-changed-text); + background-color: var(--color-prettylights-syntax-markup-changed-bg); +} + +.markdown-body .pl-mi2 { + color: var(--color-prettylights-syntax-markup-ignored-text); + background-color: var(--color-prettylights-syntax-markup-ignored-bg); +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: var(--color-prettylights-syntax-meta-diff-range); +} + +.markdown-body .pl-ba { + color: var(--color-prettylights-syntax-brackethighlighter-angle); +} + +.markdown-body .pl-sg { + color: var(--color-prettylights-syntax-sublimelinter-gutter-mark); +} + +.markdown-body .pl-corl { + text-decoration: underline; + color: var(--color-prettylights-syntax-constant-other-reference-link); +} + +.markdown-body g-emoji { + display: inline-block; + min-width: 1ch; + font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + font-size: 1em; + font-style: normal !important; + font-weight: var(--base-text-weight-normal, 400); + line-height: 1; + vertical-align: -0.075em; +} + +.markdown-body g-emoji img { + width: 1em; + height: 1em; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item label { + font-weight: var(--base-text-weight-normal, 400); +} + +.markdown-body .task-list-item.enabled label { + cursor: pointer; +} + +.markdown-body .task-list-item + .task-list-item { + margin-top: 4px; +} + +.markdown-body .task-list-item .handle { + display: none; +} + +.markdown-body .task-list-item-checkbox { + margin: 0 0.2em 0.25em -1.4em; + vertical-align: middle; +} + +.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox { + margin: 0 -1.6em 0.25em 0.2em; +} + +.markdown-body .contains-task-list { + position: relative; +} + +.markdown-body .contains-task-list:hover .task-list-item-convert-container, +.markdown-body + .contains-task-list:focus-within + .task-list-item-convert-container { + display: block; + width: auto; + height: 24px; + overflow: visible; + clip: auto; +} + +.markdown-body ::-webkit-calendar-picker-indicator { + filter: invert(50%); +} + +.markdown-body pre code { + font-size: 12px; + color: var(--color-fg-default); +} + +.markdown-body pre:has(pre code) { + padding: 0; +} + +.markdown-body pre pre:has(code) { + padding: 16px !important; + margin-bottom: 0; +} + +.markdown-body pre pre code { + color: rgb(192, 197, 206) !important; +} + +.markdown-body .chat-tools { + margin-top: 32px !important; +} + +.chat-tool { + position: relative; + border: 1px solid #eceef1; + border-radius: 10px; + overflow: hidden; + margin-bottom: 16px; + cursor: pointer; + height: 54px; + background-color: #f8f9fa; +} + +.chat-tool .chat-tool-args, +.chat-tool .chat-tool-result { + display: none; +} + +.chat-tool-expend-args, +.chat-tool-expend-result { + height: auto; +} + +.chat-tool-expend-args .chat-tool-args, +.chat-tool-expend-result .chat-tool-result { + display: block; +} + +.chat-tool-expend-btn { + position: absolute; + right: 16px; + top: 16px; + z-index: 10; + display: flex; + align-items: center; + gap: 16px; +} + +.chat-tool-run { + display: flex; + align-items: center; + gap: 4px; + font-weight: bold; + color: #3248f2; + cursor: pointer; + font-size: 14px; + padding-right: 16px; +} + +.chat-tool-expend-text { + cursor: pointer; + font-size: 14px; + line-height: 21px; + display: flex; + align-items: center; + gap: 4px; +} + +.chat-tool-expend-text-active { + color: #3248f2; +} + +.chat-tool-name { + padding: 16px; + font-size: 14px; + line-height: 21px; + height: 53px; + font-weight: bold; + border-bottom: 1px solid #eceef1; + background-color: #ffffff; +} + +.chat-tool-name-text { + display: flex; + align-items: center; + font-weight: bold; + gap: 8px; +} + +.chat-tool-name p { + margin-bottom: 0; +} + +.chat-tool-args, +.chat-tool-result { + max-height: 300px; + overflow: auto; + color: #21222d; + position: relative; + background-color: #f8f9fa; +} + +.chat-tool pre { + border-radius: 0; + margin-bottom: 0; + height: auto; +} + +.chat-tool pre p:last-child { + margin-bottom: 0; +} + +.chat-error { + display: inline-block; + color: #ff502c; + font-weight: bold; +} diff --git a/ui/src/components/avatar/index.tsx b/ui/src/components/avatar/index.tsx new file mode 100644 index 0000000..3022104 --- /dev/null +++ b/ui/src/components/avatar/index.tsx @@ -0,0 +1,62 @@ +import Logo from '@/assets/images/logo.png'; +import { Avatar as MuiAvatar, type SxProps } from '@mui/material'; +import { Icon } from '@c-x/ui'; +import { type ReactNode } from 'react'; + +interface AvatarProps { + src?: string; + className?: string; + sx?: SxProps; + errorIcon?: ReactNode; + errorImg?: ReactNode; + name?: string; +} + +function stringToColor(string: string) { + let hash = 0; + let i; + + for (i = 0; i < string.length; i += 1) { + hash = string.charCodeAt(i) + ((hash << 5) - hash); + } + + let color = '#'; + + for (i = 0; i < 3; i += 1) { + const value = (hash >> (i * 8)) & 0xff; + color += `00${value.toString(16)}`.slice(-2); + } + + return color; +} + +function stringAvatar(name: string) { + return { + sx: { + bgcolor: stringToColor(name), + }, + children: `${name.split(' ')[0][0]}`, + }; +} + +const Avatar = (props: AvatarProps) => { + const src = props.src; + return ( + , + })} + src={src} + > + ); +}; + +export default Avatar; diff --git a/ui/src/components/card/index.tsx b/ui/src/components/card/index.tsx new file mode 100644 index 0000000..bc38c7b --- /dev/null +++ b/ui/src/components/card/index.tsx @@ -0,0 +1,9 @@ +import { styled } from '@mui/material'; + +const StyledCard = styled('div')(({ theme }) => ({ + padding: theme.spacing(2), + borderRadius: theme.shape.borderRadius * 2.5, + backgroundColor: theme.palette.background.default, +})); + +export default StyledCard; diff --git a/ui/src/components/form/index.tsx b/ui/src/components/form/index.tsx new file mode 100644 index 0000000..3c52622 --- /dev/null +++ b/ui/src/components/form/index.tsx @@ -0,0 +1,13 @@ +'use client'; +import { styled, FormLabel } from '@mui/material'; + +export const StyledFormLabel = styled(FormLabel)(({ theme }) => ({ + display: 'block', + color: theme.vars.palette.text.primary, + fontSize: 16, + fontWeight: 500, + marginBottom: theme.spacing(1), + [theme.breakpoints.down('sm')]: { + fontSize: 14, + }, +})); diff --git a/ui/src/components/header/Bread.tsx b/ui/src/components/header/Bread.tsx new file mode 100644 index 0000000..22f8c3b --- /dev/null +++ b/ui/src/components/header/Bread.tsx @@ -0,0 +1,115 @@ +import KeyboardArrowRightRoundedIcon from '@mui/icons-material/KeyboardArrowRightRounded'; +import { Box, Stack, useTheme } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { NavLink, useLocation } from 'react-router-dom'; + +const HomeBread = { title: '工作台', to: '/' }; +const OtherBread = { + dashboard: { title: '仪表盘', to: '/' }, + chat: { title: '对话记录', to: '/chat' }, + completion: { title: '补全记录', to: '/completion' }, + model: { title: '模型管理', to: '/model' }, + user: { title: '用户管理', to: '/user' }, + admin: { title: '管理员', to: '/admin' }, +}; + +const Bread = () => { + const theme = useTheme(); + const { pathname } = useLocation(); + const [breads, setBreads] = useState< + { title: React.ReactNode; to: string }[] + >([]); + + useEffect(() => { + const curBreads: { title: React.ReactNode; to: string }[] = [ + { + title: ( + + MonkeyCode + + ), + to: '/dashboard', + }, + ]; + if (pathname === '/') { + curBreads.push(HomeBread); + } else { + const pieces = pathname.split('/').filter((it) => it !== ''); + pieces.forEach((it) => { + const bread = OtherBread[it as keyof typeof OtherBread]; + if (bread) { + curBreads.push(bread); + } + }); + } + // if (pageName) { + // curBreads.push({ title: pageName, to: 'custom' }) + // } + setBreads(curBreads); + }, [pathname]); + + return ( + + {/* */} + {breads.map((it, idx) => { + return ( + + {idx !== 0 && ( + + )} + {it.to === 'custom' ? ( + + {it.title} + + ) : ( + + + {it.title} + + + )} + + ); + })} + + ); +}; + +export default Bread; diff --git a/ui/src/components/header/index.tsx b/ui/src/components/header/index.tsx new file mode 100644 index 0000000..fa2fdd8 --- /dev/null +++ b/ui/src/components/header/index.tsx @@ -0,0 +1,61 @@ +import { Button, IconButton, Stack } from '@mui/material'; +import { Icon, message } from '@c-x/ui'; +import { useNavigate } from 'react-router-dom'; +import LogoutIcon from '@mui/icons-material/Logout'; +import DownloadIcon from '@mui/icons-material/Download'; +import { Box } from '@mui/material'; +import Bread from './Bread'; + +const Header = () => { + const navigate = useNavigate(); + + return ( + + + + + + { + // 清除本地存储的认证信息 + localStorage.removeItem('auth_token'); + localStorage.removeItem('user_info'); + message.success('退出登录成功'); + navigate('/login', { replace: true }); + }} + > + + + + + ); +}; + +export default Header; diff --git a/ui/src/components/lottieIcon/index.tsx b/ui/src/components/lottieIcon/index.tsx new file mode 100644 index 0000000..ac630bc --- /dev/null +++ b/ui/src/components/lottieIcon/index.tsx @@ -0,0 +1,28 @@ +import Lottie from 'lottie-react'; +import { CSSProperties } from 'react'; + +const LottieIcon = ({ + id, + src, + loop = true, + autoplay = true, + style, +}: { + id: string; + src: any; + loop?: boolean; + autoplay?: boolean; + style?: CSSProperties; +}) => { + return ( + + ); +}; + +export default LottieIcon; diff --git a/ui/src/components/markDown/index.tsx b/ui/src/components/markDown/index.tsx new file mode 100644 index 0000000..581bad8 --- /dev/null +++ b/ui/src/components/markDown/index.tsx @@ -0,0 +1,482 @@ +// import { ToolInfo } from '@/api'; +import { Icon, message } from '@c-x/ui'; +import { Box, Button, IconButton, Stack, useTheme, alpha } from '@mui/material'; +import React, { useState } from 'react'; +import ReactMarkdown, { Components } from 'react-markdown'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import { github } from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import rehypeRaw from 'rehype-raw'; +import rehypeSanitize, { defaultSchema } from 'rehype-sanitize'; +import remarkBreaks from 'remark-breaks'; +import remarkGfm from 'remark-gfm'; +import ExpandMoreRoundedIcon from '@mui/icons-material/ExpandMoreRounded'; + +interface ExtendedComponents extends Components { + tools?: React.ComponentType; +} + +export const toolNames = [ + 'execute_command', + 'read_file', + 'write_to_file', + 'apply_diff', + 'insert_content', + 'search_and_replace', + 'search_files', + 'list_files', + 'list_code_definition_names', + 'browser_action', + 'use_mcp_tool', + 'access_mcp_resource', + 'ask_followup_question', + 'attempt_completion', + 'switch_mode', + 'new_task', + 'fetch_instructions', +]; + +// 去掉下划线的标签名,用于Markdown渲染 +export const toolTagNames = toolNames.map((name) => name.replace(/_/g, '')); + +type ToolInfo = any; + +const MarkDown = ({ + loading = false, + content, + showToolInfo = {}, + setShowToolInfo, + setCurrentToolId, + handleSearchAbort, +}: { + loading?: boolean; + content: string; + showToolInfo: Record; + setShowToolInfo: (value: Record) => void; + setCurrentToolId?: (value: string) => void; + handleSearchAbort?: () => void; +}) => { + const theme = useTheme(); + const [showThink, setShowThink] = useState(false); + + // 将content中的下划线标签替换为无下划线版本 + const processContent = (content: string) => { + let processedContent = content; + + toolNames.forEach((toolName) => { + const withUnderscore = toolName; + const withoutUnderscore = toolName.replace(/_/g, ''); + + // 替换开始标签 + const openTagPattern = new RegExp(`<${withUnderscore}>`, 'g'); + processedContent = processedContent.replace( + openTagPattern, + `<${withoutUnderscore}>` + ); + + // 替换结束标签 + const closeTagPattern = new RegExp(``, 'g'); + processedContent = processedContent.replace( + closeTagPattern, + `` + ); + }); + + return processedContent; + }; + + // const answer = processContent(content); + + const answer = content; + + if (content.length === 0) return null; + + return ( + + ) => { + return ( +
+ {children} +
+ ); + }, + tools: ({ + id = '', + ...rest + }: React.HTMLAttributes) => { + const _id = id.replace('user-content-', ''); + return ( +
+
+
+ + 工具调用 +
+
+
+ {!showToolInfo[_id].done && ( + + + + + )} +
+ ); + }, + tool: ({ + id = '', + ...rest + }: React.HTMLAttributes & { id?: string }) => { + const _id = id.replace('user-content-', ''); + const className = showToolInfo[_id] + ? showToolInfo[_id].args + ? 'chat-tool chat-tool-expend-args' + : showToolInfo[_id].result + ? 'chat-tool chat-tool-expend-result' + : 'chat-tool' + : 'chat-tool'; + return ( +
+
+ {!!showToolInfo[_id] && ( +
+
{ + setShowToolInfo({ + ...showToolInfo, + [_id]: { + args: !showToolInfo[_id].args, + result: false, + done: showToolInfo[_id].done, + }, + }); + }} + > + 参数 + +
+ {showToolInfo[_id].done && ( +
{ + setShowToolInfo({ + ...showToolInfo, + [_id]: { + args: false, + result: !showToolInfo[_id].result, + done: showToolInfo[_id].done, + }, + }); + }} + > + 结果 + +
+ )} +
+ )} +
+ ); + }, + toolname: (props: React.HTMLAttributes) => { + return
{props.children}
; + }, + toolargs: ({ + children, + ...rest + }: React.HTMLAttributes) => { + const safeChildren = React.Children.toArray(children).filter( + (child) => child !== '\n' + ); + let innerText: React.ReactNode = ''; + try { + if ( + safeChildren.length > 1 && + React.isValidElement(safeChildren[1]) + ) { + const secondChild = safeChildren[1] as React.ReactElement<{ + children?: React.ReactNode; + }>; + if (secondChild.props && secondChild.props.children) { + const jsonString = String(secondChild.props.children); + innerText = JSON.stringify(JSON.parse(jsonString), null, 2); + } + } else { + innerText = safeChildren; + } + } catch (err) { + console.error(err); + innerText = safeChildren; + } + return ( +
+
{innerText}
+
+ ); + }, + toolresult: ({ + children, + ...rest + }: React.HTMLAttributes) => { + const safeChildren = React.Children.toArray( + children || [] + ).filter((child) => child !== '\n'); + const hasPreTag = safeChildren.some( + (child) => React.isValidElement(child) && child.type === 'pre' + ); + return hasPreTag ? ( +
+ ) : ( +
+
+                
+ ); + }, + // thinking: (props: React.HTMLAttributes) => { + // return ( + //
+ //
+ // {!loading && ( + // setShowThink(!showThink)} + // sx={{ + // bgcolor: 'background.paper', + // ':hover': { + // bgcolor: alpha(theme.palette.primary.main, 0.1), + // color: theme.palette.primary.main, + // }, + // }} + // > + // + // + // )} + //
+ // ); + // }, + h1: (props: React.HTMLAttributes) => ( +

+ ), + a: ({ + children, + style, + ...rest + }: React.HTMLAttributes) => ( + + {children} + + ), + img: (props: React.ImgHTMLAttributes) => { + const { style, alt, ...rest } = props; + return ( + {alt + ); + }, + attemptcompletion: (props: React.HTMLAttributes) => { + return ( +
+ {props.children} +
+ ); + }, + code({ + children, + className, + ...rest + }: React.HTMLAttributes) { + const match = /language-(\w+)/.exec(className || ''); + return match ? ( + { + if (navigator.clipboard) { + navigator.clipboard.writeText( + String(children).replace(/\n$/, '') + ); + message.success('复制成功'); + } + }} + > + {String(children).replace(/\n$/, '')} + + ) : ( + { + if (navigator.clipboard) { + navigator.clipboard.writeText(String(children)); + message.success('复制成功'); + } + }} + > + {children} + + ); + }, + } as ExtendedComponents + } + > + {answer} + + + ); +}; + +export default MarkDown; diff --git a/ui/src/components/sidebar/index.tsx b/ui/src/components/sidebar/index.tsx new file mode 100644 index 0000000..7e91bf7 --- /dev/null +++ b/ui/src/components/sidebar/index.tsx @@ -0,0 +1,264 @@ +import Logo from '@/assets/images/logo.png'; +import { alpha, Box, Button, Stack, useTheme } from '@mui/material'; +import { Icon } from '@c-x/ui'; +import { NavLink, useLocation } from 'react-router-dom'; +import Avatar from '../avatar'; +import { Modal } from '@c-x/ui'; +import { useState } from 'react'; +import Qrcode from '@/assets/images/qrcode.png'; +import Version from './version'; + +const menus = [ + { + label: '仪表盘', + value: '/dashboard', + pathname: 'dashboard', + icon: 'icon-yibiaopan', + show: true, + }, + { + label: '对话记录', + value: '/chat', + pathname: 'chat', + icon: 'icon-duihuajilu1', + show: true, + }, + { + label: '补全记录', + value: '/completion', + pathname: 'completion', + icon: 'icon-buquanjilu', + show: true, + }, + { + label: '代码安全', + value: '/code-security', + pathname: 'code-security', + icon: 'icon-daimaanquan1', + show: true, + }, + { + label: '模型管理', + value: '/model', + pathname: 'model', + icon: 'icon-moxingguanli', + show: true, + }, + { + label: '用户管理', + value: '/user', + pathname: 'user', + icon: 'icon-yonghuguanli1', + show: true, + }, + { + label: '管理员', + value: '/admin', + pathname: 'admin', + icon: 'icon-guanliyuan1', + show: true, + }, +]; + +const Sidebar = () => { + const { pathname } = useLocation(); + const theme = useTheme(); + const [showQrcode, setShowQrcode] = useState(false); + return ( + + { + window.open('https://baizhi.cloud', '_blank'); + }} + > + + + MonkeyCode + + + + + {menus.map((it) => { + let isActive = false; + if (it.value === '/') { + isActive = pathname === '/'; + } else { + isActive = pathname.includes(it.value); + } + if (!it.show) return null; + return ( + + + + ); + })} + + + + + + + + setShowQrcode(false)} + title='欢迎加入 MonkeyCode 交流群' + footer={null} + > + + + + + + ); +}; + +export default Sidebar; diff --git a/ui/src/components/sidebar/version.tsx b/ui/src/components/sidebar/version.tsx new file mode 100644 index 0000000..955aa97 --- /dev/null +++ b/ui/src/components/sidebar/version.tsx @@ -0,0 +1,82 @@ +import HelpCenter from '@/assets/json/help-center.json'; +import IconUpgrade from '@/assets/json/upgrade.json'; +import LottieIcon from '@/components/lottieIcon'; +import { Box, Stack, Tooltip } from '@mui/material'; +import { Icon } from '@c-x/ui'; +import { useEffect, useState } from 'react'; +import packageJson from '../../../package.json'; + +const Version = () => { + const curVersion = packageJson.version; + const [latestVersion, setLatestVersion] = useState( + undefined + ); + + useEffect(() => { + fetch('https://release.baizhi.cloud/monekycode/version.txt') + .then((response) => response.text()) + .then((data) => { + setLatestVersion(data); + }) + .catch((error) => { + console.error(error); + setLatestVersion(''); + }); + }, []); + + if (latestVersion === undefined) return null; + + return ( + { + window.open( + 'https://pandawiki.docs.baizhi.cloud/node/01971615-05b8-7924-9af7-15f73784f893' + ); + }} + > + + + 免费版 + + + {curVersion} + {latestVersion !== `v${curVersion}` && ( + + + + + + )} + + + ); +}; + +export default Version; diff --git a/ui/src/index.css b/ui/src/index.css new file mode 100644 index 0000000..18d4fb2 --- /dev/null +++ b/ui/src/index.css @@ -0,0 +1,67 @@ +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + box-sizing: border-box; + -webkit-text-size-adjust: 100%; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + margin: 0; + font-family: 'PingFang SC', var(--font-gilory), var(--font-HarmonyOS), + 'Roboto', 'Helvetica', 'Arial', sans-serif; + color: var(--mui-palette-text-primary); + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.00938em; +} + +a { + color: inherit; + text-decoration: none; +} + +.text-ellipsis { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.multiline-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; +} + +::-webkit-scrollbar { + width: 4px; + /* 纵向滚动条*/ + height: 0; + /* 横向滚动条隐藏 */ + border-radius: 10px; +} + +/*定义滚动条轨道 内阴影*/ +::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0); + background-color: #fff; + border-radius: 10px; +} + +/*定义滑块 内阴影*/ +::-webkit-scrollbar-thumb { + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0); + background-color: #ccc; + border-radius: 10px; +} + +/* .MuiTable-root { + height: 100%; +} */ diff --git a/ui/src/layouts/mainLayout/index.tsx b/ui/src/layouts/mainLayout/index.tsx new file mode 100644 index 0000000..fc2646d --- /dev/null +++ b/ui/src/layouts/mainLayout/index.tsx @@ -0,0 +1,73 @@ +import { Stack, Box } from '@mui/material'; +import { Outlet, Navigate } from 'react-router-dom'; +import { useEffect, useState } from 'react'; +import Sidebar from '@/components/sidebar'; +import Header from '@/components/header'; + +const MainLayout = () => { + const [isAuthenticated, setIsAuthenticated] = useState(null); + + useEffect(() => { + // 检查用户是否已登录 + const token = localStorage.getItem('auth_token'); + const userInfo = localStorage.getItem('user_info'); + + if (token && userInfo) { + setIsAuthenticated(true); + } else { + setIsAuthenticated(false); + } + }, []); + + // 如果还在检查认证状态,显示加载状态 + if (isAuthenticated === null) { + return ( + +
加载中...
+
+ ); + } + + // 如果未认证,重定向到登录页 + if (!isAuthenticated) { + // return ; + } + return ( + + + +
+ + + + + {/* */} + + + ); +}; + +export default MainLayout; diff --git a/ui/src/main.tsx b/ui/src/main.tsx new file mode 100644 index 0000000..a5b192c --- /dev/null +++ b/ui/src/main.tsx @@ -0,0 +1,27 @@ +import ReactDOM from 'react-dom/client'; +import 'dayjs/locale/zh-cn'; +import { RouterProvider } from 'react-router-dom'; +import '@/assets/fonts/iconfont'; +import './index.css'; +import '@/assets/styles/markdown.css'; +import { ThemeProvider } from '@c-x/ui'; +import dayjs from 'dayjs'; +import duration from 'dayjs/plugin/duration'; +import relativeTime from 'dayjs/plugin/relativeTime'; + +import { lightTheme } from './theme'; + +import router from './router'; + +dayjs.locale('zh-cn'); +dayjs.extend(duration); +dayjs.extend(relativeTime); + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement +); +root.render( + + + +); diff --git a/ui/src/pages/admin/adminTable.tsx b/ui/src/pages/admin/adminTable.tsx new file mode 100644 index 0000000..9adb3a4 --- /dev/null +++ b/ui/src/pages/admin/adminTable.tsx @@ -0,0 +1,245 @@ +import Card from '@/components/card'; +import { + Stack, + Box, + Button, + IconButton, + TextField, + Paper, +} from '@mui/material'; +import { postCreateAdmin } from '@/api/User'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { deleteDeleteAdmin, getListAdminUser } from '@/api/User'; +import { Table, Modal, message } from '@c-x/ui'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { useRequest } from 'ahooks'; +import dayjs from 'dayjs'; +import { DomainAdminUser } from '@/api/types'; +import { Controller, useForm } from 'react-hook-form'; +import { useEffect, useState } from 'react'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; + +const AddAdminModal = ({ + open, + onCancel, + onOk, +}: { + open: boolean; + onCancel: () => void; + onOk: () => void; +}) => { + const { + control, + handleSubmit, + formState: { errors }, + reset, + watch, + } = useForm(); + + const username = watch('username'); + const [password, setPassword] = useState(''); + const [isSuccess, setIsSuccess] = useState(false); + + const onSubmit = handleSubmit((data) => { + postCreateAdmin({ + username: data.username, + password, + }).then(() => { + setIsSuccess(true); + message.success('添加成功'); + onOk(); + }); + }); + + useEffect(() => { + if (open) { + reset(); + } else { + setIsSuccess(false); + setPassword(Math.random().toString(36).substring(2, 15)); + } + }, [open]); + + return ( + + {!isSuccess && ( + + ( + + )} + /> + + + + + + )} + + {isSuccess && ( + + + 账号添加成功,请将账号和密码复制到剪贴板 + + + + 账号:{username} + 密码:{password} + + + { + message.success('复制成功'); + onCancel(); + }} + > + + + + )} + + ); +}; + +const AdminTable = () => { + const [open, setOpen] = useState(false); + const { data, loading, refresh } = useRequest(() => getListAdminUser({})); + const onDeleteAdmin = (data: DomainAdminUser) => { + Modal.confirm({ + title: '提示', + okText: '删除', + okButtonProps: { + color: 'error', + }, + content: ( + <> + 确定要删除该管理员{' '} + + {data.username} + {' '} + 吗? + + ), + onOk: () => { + deleteDeleteAdmin({ id: data.id! }).then(() => { + message.success('删除成功'); + refresh(); + }); + }, + }); + }; + const columns: ColumnsType = [ + { + title: '账号', + dataIndex: 'username', + }, + { + title: '最近活跃时间', + dataIndex: 'last_active_at', + render: (text) => { + return dayjs(text).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + { + title: '', + dataIndex: 'opt', + width: 200, + render: (_, record) => { + return ( + + ); + }, + }, + ]; + return ( + + + 管理员 + + + + columns={columns} + loading={loading} + dataSource={data?.users || []} + pagination={false} + rowKey='id' + sx={{ mx: -2 }} + /> + setOpen(false)} + /> + + ); +}; + +export default AdminTable; diff --git a/ui/src/pages/admin/index.tsx b/ui/src/pages/admin/index.tsx new file mode 100644 index 0000000..b4e7a44 --- /dev/null +++ b/ui/src/pages/admin/index.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import LoginHistory from './loginHistory'; +import AdminTable from './adminTable'; +import { Stack } from '@mui/material'; + +const Admin = () => { + return ( + + + + + ); +}; + +export default Admin; diff --git a/ui/src/pages/admin/loginHistory.tsx b/ui/src/pages/admin/loginHistory.tsx new file mode 100644 index 0000000..43460ae --- /dev/null +++ b/ui/src/pages/admin/loginHistory.tsx @@ -0,0 +1,70 @@ +import Card from '@/components/card'; +import { Stack, Box } from '@mui/material'; +import { Table } from '@c-x/ui'; +import dayjs from 'dayjs'; +import { useRequest } from 'ahooks'; +import { getAdminLoginHistory } from '@/api/User'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { DomainListAdminLoginHistoryResp, DomainAdminUser } from '@/api/types'; + +type LoginHistory = NonNullable< + DomainListAdminLoginHistoryResp['login_histories'] +>[number]; + +const LoginHistory = () => { + const { data, loading } = useRequest(() => getAdminLoginHistory({})); + const columns: ColumnsType = [ + { + title: '账号', + dataIndex: 'user', + render: (user, record) => { + return record?.user?.username; + }, + }, + { + title: 'IP 地址', + dataIndex: 'ip', + render: (ip, record) => { + let address = ''; + if (record?.ip_info) { + address = `${record?.ip_info?.country}-${record?.ip_info?.city}`; + } + return ( + + {ip} + ({address}) + + ); + }, + }, + { + title: '登录时间', + dataIndex: 'created_at', + render: (text) => { + return dayjs.unix(text).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + ]; + return ( + + + 登录记录 + + + + ); +}; + +export default LoginHistory; diff --git a/ui/src/pages/auth/index.tsx b/ui/src/pages/auth/index.tsx new file mode 100644 index 0000000..0869814 --- /dev/null +++ b/ui/src/pages/auth/index.tsx @@ -0,0 +1,429 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Button, + TextField, + Typography, + Container, + Paper, + Alert, + CircularProgress, + Grid2 as Grid, + Link, + Chip, + Stack, +} from '@mui/material'; +import CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded'; +import { useSearchParams } from 'react-router-dom'; +import { postLogin } from '@/api/User'; +import Lock from '@mui/icons-material/Lock'; +import Person from '@mui/icons-material/Person'; +import { useForm, Controller } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import { + generateVSCodeAuthToken, + openVSCodeWithAuth, + checkVSCodeInstalled, + getVSCodeDownloadUrl, + storeAuthToken, + generatePluginConfig, + type VSCodeAuthToken, +} from '@/utils/vscode'; + +// 样式化组件 +const StyledContainer = styled(Container)(({ theme }) => ({ + minHeight: '100vh', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + maxWidth: '100% !important', + background: theme.palette.background.paper, +})); + +const StyledPaper = styled(Paper)(({ theme }) => ({ + padding: theme.spacing(4), + maxWidth: 450, + width: '100%', + borderRadius: theme.spacing(2), + boxShadow: '0 8px 32px rgba(0, 0, 0, 0.1)', +})); + +const LogoContainer = styled(Box)(({ theme }) => ({ + textAlign: 'center', + marginBottom: theme.spacing(3), +})); + +// 表单数据类型 +interface LoginFormData { + username: string; + password: string; +} + +const AuthPage = () => { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [success, setSuccess] = useState(null); + const [authStep, setAuthStep] = useState<'login' | 'authorize' | 'success'>( + 'login' + ); + const [vscodeInstalled, setVscodeInstalled] = useState(null); + const [authToken, setAuthToken] = useState(null); + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const { + control, + handleSubmit, + formState: { errors }, + } = useForm(); + + // 检查 VSCode 是否已安装 + useEffect(() => { + // checkVSCodeInstalled().then(setVscodeInstalled); + }, []); + + // 打开 VSCode 并处理授权 + const handleOpenVSCode = (token: VSCodeAuthToken) => { + try { + openVSCodeWithAuth(token); + + // 生成插件配置 + const pluginConfig = generatePluginConfig(token); + + setSuccess(` + 授权成功! + + 令牌: ${token.token} + 用户ID: ${token.userId} + 权限: ${token.permissions.join(', ')} + + 插件配置已生成,VSCode 插件将自动获取这些信息。 + 如果 VSCode 没有自动打开,请手动打开 VSCode。 + `); + + console.log('插件配置:', pluginConfig); + } catch (error) { + setError(error instanceof Error ? error.message : '打开 VSCode 失败'); + } + }; + + // 处理登录表单提交 + const onSubmit = async (data: LoginFormData) => { + setLoading(true); + setError(null); + + try { + // 步骤1: 用户登录 + const loginResult = await postLogin({ + ...data, + session_id: searchParams.get('session_id')!, + }); + + // setAuthStep('authorize'); + + // 步骤2: 生成 VSCode 授权令牌 + // const vscodeAuth = generateVSCodeAuthToken(loginResult.id!, [ + // 'read', + // 'write', + // 'execute', + // ]); + + // // 存储 VSCode 授权信息 + // storeAuthToken(vscodeAuth); + // setAuthToken(vscodeAuth); + + setAuthStep('success'); + + // 步骤3: 打开 VSCode + // handleOpenVSCode(vscodeAuth); + + try { + // 尝试打开 VSCode + window.location.href = loginResult.redirect_url!; + + // 记录授权日志 + console.log('VSCode 授权信息已发送:', { + uri: loginResult.redirect_url, + }); + } catch (error) { + console.error('打开 VSCode 失败:', error); + setError('无法打开 VSCode,请确保已安装 VSCode'); + } + } catch (err) { + setError(err instanceof Error ? err.message : '登录失败,请重试'); + setAuthStep('login'); + } finally { + setLoading(false); + } + }; + + // 重新授权 + const handleReauthorize = async () => { + if (!authToken) return; + + setLoading(true); + setError(null); + + try { + const newToken = generateVSCodeAuthToken( + authToken.userId, + authToken.permissions + ); + storeAuthToken(newToken); + setAuthToken(newToken); + handleOpenVSCode(newToken); + } catch (err) { + setError('重新授权失败,请重试'); + } finally { + setLoading(false); + } + }; + + // 继续到主应用 + const handleContinue = () => { + navigate('/dashboard'); + }; + + // 渲染登录表单 + const renderLoginForm = () => ( + <> + + + Monkey Code + + + 登录您的账户以授权 VSCode 插件 + + + {/* {vscodeInstalled !== null && ( + + + + )} */} + + + + + + ( + + ), + }, + }} + /> + )} + /> + + + + ( + + ), + }, + }} + /> + )} + /> + + + {error && ( + + {error} + + )} + + + + + + {!vscodeInstalled && vscodeInstalled !== null && ( + + + + 未检测到 VSCode,建议先{' '} + + 下载并安装 Visual Studio Code + + + + + )} + + + + ); + + // 渲染授权进度 + const renderAuthorizationStep = () => ( + + + + 正在授权 VSCode 插件 + + + 请稍候,正在生成授权令牌并尝试打开 VSCode... + + + ); + + // 渲染成功页面 + const renderSuccessStep = () => ( + <> + + + + 授权成功! + + + VSCode 授权已完成,插件可以正常使用了。 + + + + {/* {success && ( + + {success} + + )} */} + + {/* {authToken && ( + + + 授权信息: + + + {authToken.permissions.map((permission) => ( + + ))} + + + )} */} + + + {/* + + */} + + {/* + + */} + + + + + + + + + ); + + return ( + + + {authStep === 'login' && renderLoginForm()} + {authStep === 'authorize' && renderAuthorizationStep()} + {authStep === 'success' && renderSuccessStep()} + + + ); +}; + +export default AuthPage; diff --git a/ui/src/pages/chat/chatDetailModal.tsx b/ui/src/pages/chat/chatDetailModal.tsx new file mode 100644 index 0000000..814ede7 --- /dev/null +++ b/ui/src/pages/chat/chatDetailModal.tsx @@ -0,0 +1,252 @@ +import Avatar from '@/components/avatar'; +import Card from '@/components/card'; +import { getChatInfo } from '@/api/Billing'; +import MarkDown from '@/components/markDown'; +import { addCommasToNumber, processText } from '@/utils'; +import { Ellipsis, Icon, Modal } from '@c-x/ui'; +import { Box, Stack, Tooltip, useTheme } from '@mui/material'; +import dayjs from 'dayjs'; +import { useEffect, useState } from 'react'; +import { DomainChatRecord } from '@/api/types'; + +type ConversationItem = any; +type ToolInfo = any; + +const ChatDetailModal = ({ + data, + open, + onClose, +}: { + data?: DomainChatRecord; + open: boolean; + onClose: () => void; +}) => { + const theme = useTheme(); + const [ChatDetailModal, setChatDetailModal] = + useState(null); + const [content, setContent] = useState(''); + const [showToolInfo, setShowToolInfo] = useState<{ [key: string]: ToolInfo }>( + {} + ); + + const getChatDetailModal = () => { + if (!data) return; + getChatInfo({ id: data.id! }).then((res) => { + setContent(res.content || ''); + }); + // getConversationChatDetailModal({ id }).then((res) => { + // const newAnswer = res.answer + // const toolWrapsIds = newAnswer.match(//g)?.map(match => { + // const idMatch = match.match(//); + // return idMatch ? idMatch[1] : null; + // }).filter(Boolean) || []; + // const toolIds = newAnswer.match(//g)?.map(match => { + // const idMatch = match.match(//); + // return idMatch ? idMatch[1] : null; + // }).filter(Boolean) || []; + // const obj: { [key: string]: ToolInfo } = {} + // toolWrapsIds.forEach(id => { + // obj[id!] = { + // done: true, + // } + // }) + // toolIds.forEach(id => { + // obj[id!] = { + // args: false, + // result: false, + // done: true, + // } + // }) + // setShowToolInfo(obj) + // setChatDetailModal({ ...res, answer: processText(res.answer) }) + // }) + }; + + useEffect(() => { + if (open) getChatDetailModal(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, open]); + + return ( + + {data?.question || '-'} + + } + width={800} + open={open} + onCancel={onClose} + footer={null} + > + {ChatDetailModal ? ( + + + {ChatDetailModal.created_at && ( + + + {dayjs(ChatDetailModal.created_at).format( + 'YYYY-MM-DD HH:mm:ss' + )} + + )} + {ChatDetailModal.remote_ip && ( + + + {ChatDetailModal.remote_ip} + + )} + {ChatDetailModal.model && ( + + + 使用模型 + {ChatDetailModal.model} + + )} + {data?.input_tokens && data?.output_tokens && ( + + + 输入 Token 使用: {addCommasToNumber(data?.input_tokens)} + + + 输出 Token 使用: {addCommasToNumber(data?.output_tokens)} + + + } + > + + + Token 统计 + + {addCommasToNumber( + data?.input_tokens + data?.output_tokens + )} + + + + + )} + + {ChatDetailModal.references?.length > 0 && ( + <> + + 内容来源 + + + {ChatDetailModal.references.map((item: any, index: number) => ( + + + } + /> + + + {item.title} + + + + ))} + + + )} + + 回答 + + + ) : ( + + )} + + + + + ); +}; + +export default ChatDetailModal; diff --git a/ui/src/pages/chat/index.tsx b/ui/src/pages/chat/index.tsx new file mode 100644 index 0000000..62b5da7 --- /dev/null +++ b/ui/src/pages/chat/index.tsx @@ -0,0 +1,147 @@ +import React, { useState, useEffect } from 'react'; +import { Table, Ellipsis } from '@c-x/ui'; +import { getListChatRecord } from '@/api/Billing'; +import { aggregatedTime } from '@/utils'; +import dayjs from 'dayjs'; +import { convertTokensToRMB } from '@/utils'; +import Card from '@/components/card'; +import { Box, Stack, styled, Chip } from '@mui/material'; + +import ChatDetailModal from './chatDetailModal'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { DomainChatRecord } from '@/api/types'; +import { addCommasToNumber } from '@/utils'; + +const StyledHighlightText = styled('span')(({ theme }) => ({ + color: theme.vars.palette.text.primary, + fontWeight: 700, +})); + +const Chat = () => { + const [page, setPage] = useState(1); + const [size, setSize] = useState(20); + const [total, setTotal] = useState(0); + const [loading, setLoading] = useState(false); + const [dataSource, setDataSource] = useState([]); + const [chatDetailModal, setChatDetailModal] = useState< + DomainChatRecord | undefined + >(); + const fetchData = async () => { + setLoading(true); + const res = await getListChatRecord({ + page: page, + size: size, + }); + setLoading(false); + setTotal(res?.total_count || 0); + setDataSource(res.records || []); + }; + + useEffect(() => { + fetchData(); + }, [page, size]); + + const columns: ColumnsType = [ + { + dataIndex: 'user', + title: '成员', + width: 160, + render(value: DomainChatRecord['user']) { + return value?.username; + }, + }, + { + dataIndex: 'question', + title: '任务', + render(value: string, record) { + return ( + setChatDetailModal(record)} + sx={{ cursor: 'pointer', color: 'info.main' }} + > + {value} + + ); + }, + }, + { + dataIndex: 'work_mode', + title: '工作模式', + width: 120, + render(value: DomainChatRecord['work_mode']) { + const workModeMap = { + code: 'warning', + chat: 'success', + ask: 'info', + }; + return ( + + ); + }, + }, + { + dataIndex: 'input_tokens', + title: '输入 Token', + width: 150, + render(value: number) { + return addCommasToNumber(value); + }, + }, + { + dataIndex: 'output_tokens', + title: '输出 Token', + width: 150, + render(value: number) { + return addCommasToNumber(value); + }, + }, + { + dataIndex: 'created_at', + title: '时间', + width: 180, + render(value: number) { + return dayjs.unix(value).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + ]; + return ( + +
{ + setPage(page); + setSize(size); + }, + }} + /> + setChatDetailModal(undefined)} + data={chatDetailModal} + /> + + ); +}; + +export default Chat; diff --git a/ui/src/pages/completion/completionDetailModal.tsx b/ui/src/pages/completion/completionDetailModal.tsx new file mode 100644 index 0000000..32b8945 --- /dev/null +++ b/ui/src/pages/completion/completionDetailModal.tsx @@ -0,0 +1,245 @@ +import Avatar from '@/components/avatar'; +import Card from '@/components/card'; +import { getChatInfo } from '@/api/Billing'; +import MarkDown from '@/components/markDown'; +import { addCommasToNumber, processText } from '@/utils'; +import { Ellipsis, Icon, Modal } from '@c-x/ui'; +import { Box, Stack, Tooltip, useTheme } from '@mui/material'; +import dayjs from 'dayjs'; +import { useEffect, useState } from 'react'; +import { DomainCompletionRecord } from '@/api/types'; + +type ConversationItem = any; +type ToolInfo = any; + +const ChatDetailModal = ({ + data, + open, + onClose, +}: { + data?: DomainCompletionRecord; + open: boolean; + onClose: () => void; +}) => { + const theme = useTheme(); + const [ChatDetailModal, setChatDetailModal] = + useState(null); + const [content, setContent] = useState(''); + const [showToolInfo, setShowToolInfo] = useState<{ [key: string]: ToolInfo }>( + {} + ); + + const getChatDetailModal = () => { + if (!data) return; + getChatInfo({ id: data.id! }).then((res) => { + setContent( + `${ + res.content || '' + }` + ); + }); + // getConversationChatDetailModal({ id }).then((res) => { + // const newAnswer = res.answer + // const toolWrapsIds = newAnswer.match(//g)?.map(match => { + // const idMatch = match.match(//); + // return idMatch ? idMatch[1] : null; + // }).filter(Boolean) || []; + // const toolIds = newAnswer.match(//g)?.map(match => { + // const idMatch = match.match(//); + // return idMatch ? idMatch[1] : null; + // }).filter(Boolean) || []; + // const obj: { [key: string]: ToolInfo } = {} + // toolWrapsIds.forEach(id => { + // obj[id!] = { + // done: true, + // } + // }) + // toolIds.forEach(id => { + // obj[id!] = { + // args: false, + // result: false, + // done: true, + // } + // }) + // setShowToolInfo(obj) + // setChatDetailModal({ ...res, answer: processText(res.answer) }) + // }) + }; + + useEffect(() => { + if (open) getChatDetailModal(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, open]); + + return ( + + {ChatDetailModal ? ( + + + {ChatDetailModal.created_at && ( + + + {dayjs(ChatDetailModal.created_at).format( + 'YYYY-MM-DD HH:mm:ss' + )} + + )} + {ChatDetailModal.remote_ip && ( + + + {ChatDetailModal.remote_ip} + + )} + {ChatDetailModal.model && ( + + + 使用模型 + {ChatDetailModal.model} + + )} + {data?.input_tokens && data?.output_tokens && ( + + + 输入 Token 使用: {addCommasToNumber(data?.input_tokens)} + + + 输出 Token 使用: {addCommasToNumber(data?.output_tokens)} + + + } + > + + + Token 统计 + + {addCommasToNumber( + data?.input_tokens + data?.output_tokens + )} + + + + + )} + + {ChatDetailModal.references?.length > 0 && ( + <> + + 内容来源 + + + {ChatDetailModal.references.map((item: any, index: number) => ( + + + } + /> + + + {item.title} + + + + ))} + + + )} + + 回答 + + + ) : ( + + )} + + + + + ); +}; + +export default ChatDetailModal; diff --git a/ui/src/pages/completion/index.tsx b/ui/src/pages/completion/index.tsx new file mode 100644 index 0000000..d07a320 --- /dev/null +++ b/ui/src/pages/completion/index.tsx @@ -0,0 +1,142 @@ +import React, { useState, useEffect } from 'react'; +import { DomainCompletionRecord } from '@/api/types'; +import { getListCompletionRecord } from '@/api/Billing'; +import { useRequest } from 'ahooks'; +import { Table } from '@c-x/ui'; +import Card from '@/components/card'; +import { Box, Button, ButtonBase, Chip, Stack, alpha } from '@mui/material'; +import dayjs from 'dayjs'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { addCommasToNumber } from '@/utils'; +import CompletionDetailModal from './completionDetailModal'; + +const Completion = () => { + const [page, setPage] = useState(1); + const [size, setSize] = useState(20); + const [total, setTotal] = useState(0); + const [dataSource, setDataSource] = useState([]); + const [loading, setLoading] = useState(false); + const [completionDetailModal, setCompletionDetailModal] = useState< + DomainCompletionRecord | undefined + >(); + const fetchData = async () => { + setLoading(true); + const res = await getListCompletionRecord({ + page: page, + size: size, + }); + setLoading(false); + setTotal(res?.total_count || 0); + setDataSource(res.records || []); + }; + + useEffect(() => { + fetchData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [page, size]); + const columns: ColumnsType = [ + { + dataIndex: 'user', + title: '成员', + + render(value: DomainCompletionRecord['user']) { + return value?.username; + }, + }, + { + dataIndex: 'task', + title: '补全内容', + width: 150, + render(_, record) { + return ( + setCompletionDetailModal(record)} + sx={{ color: 'info.main' }} + > + 点击查看 + + ); + }, + }, + + { + dataIndex: 'is_accept', + title: '是否采纳', + width: 130, + render(value: boolean) { + return ( + + ); + }, + }, + + { + dataIndex: 'program_language', + title: '编程语言', + width: 140, + }, + { + dataIndex: 'input_tokens', + title: '输入 Token', + render(value: number) { + return addCommasToNumber(value); + }, + }, + { + dataIndex: 'output_tokens', + title: '输出 Token', + + render(value: number) { + return addCommasToNumber(value); + }, + }, + { + dataIndex: 'created_at', + title: '时间', + width: 200, + render(value: number) { + return dayjs.unix(value).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + ]; + return ( + +
{ + setPage(page); + setSize(size); + }, + }} + /> + setCompletionDetailModal(undefined)} + data={completionDetailModal} + /> + + ); +}; + +export default Completion; diff --git a/ui/src/pages/dashboard/components/barCharts.tsx b/ui/src/pages/dashboard/components/barCharts.tsx new file mode 100644 index 0000000..8eeb117 --- /dev/null +++ b/ui/src/pages/dashboard/components/barCharts.tsx @@ -0,0 +1,141 @@ +import React, { useRef, useEffect } from 'react'; +import * as echarts from 'echarts'; +import { Box, Stack } from '@mui/material'; + +interface IBarChartsProps { + title: React.ReactNode; + extra?: React.ReactNode; + data: { + xData: (string | number)[]; + yData: number[]; + }; +} + +const BarCharts: React.FC = ({ title, data, extra }) => { + const { xData, yData } = data; + const domRef = useRef(null); + const echartsRef = useRef(null); + + useEffect(() => { + if (!echartsRef.current) { + echartsRef.current = echarts.init(domRef.current); + } + + const chart = echartsRef.current; + chart.setOption({ + xAxis: { + type: 'category', + data: xData, + splitLine: { + show: false, + }, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + axisLabel: { + show: false, + }, + }, + grid: { + left: 0, + right: 0, + bottom: 10, + top: 10, + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow', + }, + formatter: ( + params: { seriesName: string; name: string; value: number }[] + ) => { + if (params[0]) { + const { name, seriesName, value } = params[0]; + return `
${name}
${seriesName} ${ + value || 0 + }
`; + } + return ''; + }, + }, + + yAxis: { + type: 'value', + splitNumber: 4, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + axisLabel: { + show: false, + }, + splitLine: { + lineStyle: { + type: 'dashed', + color: '#F2F3F5', + }, + }, + }, + series: [ + { + data: yData, + type: 'bar', + name: title, + barGap: 0, + barMinHeight: 4, + itemStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: '#3248F2' }, + { offset: 1, color: '#9E68FC' }, + ], + }, + borderRadius: [4, 4, 0, 0], + }, + }, + ], + }); + + // 添加 resize 监听器 + const handleResize = () => { + echartsRef.current!.resize(); + }; + + window.addEventListener('resize', handleResize); + + // 清理函数 + return () => { + window.removeEventListener('resize', handleResize); + }; + }, [data, title]); + + return ( + + + {title} + {extra} + + +
+
+ ); +}; + +export default BarCharts; diff --git a/ui/src/pages/dashboard/components/globalStatistic.tsx b/ui/src/pages/dashboard/components/globalStatistic.tsx new file mode 100644 index 0000000..57a0cb3 --- /dev/null +++ b/ui/src/pages/dashboard/components/globalStatistic.tsx @@ -0,0 +1,198 @@ +import React, { useMemo } from 'react'; +import { Grid2 as Grid, styled } from '@mui/material'; +import dayjs from 'dayjs'; +import { + getStatisticsDashboard, + getUserCodeRankDashboard, + getTimeStatDashboard, + getCategoryStatDashboard, +} from '@/api/Dashboard'; +import { useRequest } from 'ahooks'; +import { UserCard } from './statisticCard'; +import LineCharts from './lineCharts'; +import PieCharts from './pieCharts'; +import BarCharts from './barCharts'; +import { ContributionCard } from './statisticCard'; +import { DomainTimeStat } from '@/api/types'; +import { getRecent90DaysData, getRecent60MinutesData } from '@/utils'; + +export const StyledHighlight = styled('span')(({ theme }) => ({ + fontSize: 12, + color: theme.palette.text.primary, + padding: '0 4px', +})); + +const GlobalStatistic = () => { + const { data: statisticsData } = useRequest(getStatisticsDashboard); + const { data: userCodeRankData } = useRequest(getUserCodeRankDashboard); + const { data: timeStatData } = useRequest(getTimeStatDashboard); + const { + data: categoryStatData = { + program_language: [], + work_mode: [], + }, + } = useRequest(getCategoryStatDashboard); + + const { + userActiveChartData, + chatChartData, + codeCompletionChartData, + codeLineChartData, + realTimeTokenChartData, + acceptedPerChartData, + } = useMemo(() => { + const { + active_users = [], + chats = [], + code_completions = [], + lines_of_code = [], + real_time_tokens = [], + accepted_per = [], + } = timeStatData || {}; + const userActiveChartData = getRecent90DaysData(active_users, { + valueLabel: 'value', + }); + const chatChartData = getRecent90DaysData(chats, { + valueLabel: 'value', + }); + const codeCompletionChartData = getRecent90DaysData(code_completions, { + valueLabel: 'value', + }); + const codeLineChartData = getRecent90DaysData(lines_of_code, { + valueLabel: 'value', + }); + const realTimeTokenChartData = getRecent60MinutesData(real_time_tokens, { + valueLabel: 'value', + }); + const acceptedPerChartData = getRecent90DaysData(accepted_per, { + valueLabel: 'value', + }); + return { + userActiveChartData, + chatChartData, + codeCompletionChartData, + codeLineChartData, + realTimeTokenChartData, + acceptedPerChartData, + }; + }, [timeStatData]); + + return ( + + + + + + + + 最近 90 天共 + + {timeStatData?.total_users || 0} + + 个活跃用户数 + + } + /> + + + + + + + + + + + + + 最近 90 天共 + + {timeStatData?.total_chats || 0} + + 个对话任务 + + } + /> + + + + 最近 90 天共 + + {timeStatData?.total_completions || 0} + + 个补全任务 + + } + /> + + + + 最近 90 天共修改 + + {timeStatData?.total_lines_of_code || 0} + + 行代码 + + } + /> + + + + 最近 90 天平均采纳率为 + + {(timeStatData?.total_accepted_per || 0).toFixed(2)} + + % + + } + /> + + + + + + + ); +}; + +export default GlobalStatistic; diff --git a/ui/src/pages/dashboard/components/lineCharts.tsx b/ui/src/pages/dashboard/components/lineCharts.tsx new file mode 100644 index 0000000..ec62a76 --- /dev/null +++ b/ui/src/pages/dashboard/components/lineCharts.tsx @@ -0,0 +1,150 @@ +import React, { useRef, useEffect } from 'react'; +import * as echarts from 'echarts'; +import { Box, Stack } from '@mui/material'; + +interface ILineChartsProps { + title: React.ReactNode; + extra?: React.ReactNode; + data: { + xData: (string | number)[]; + yData: number[]; + }; +} + +const LineCharts: React.FC = ({ title, data, extra }) => { + const { xData, yData } = data; + const domRef = useRef(null); + const echartsRef = useRef(null); + + useEffect(() => { + if (!echartsRef.current) { + echartsRef.current = echarts.init(domRef.current); + } + + const chart = echartsRef.current; + chart.setOption({ + xAxis: { + type: 'category', + show: false, + data: xData, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + splitLine: { + show: false, + }, + axisLabel: { + show: false, + }, + }, + grid: { + left: 0, + right: 0, + bottom: 10, + top: 10, + }, + yAxis: { + type: 'value', + splitNumber: 4, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + axisLabel: { + show: false, + }, + splitLine: { + lineStyle: { + type: 'dashed', + color: '#F2F3F5', + }, + }, + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow', + }, + formatter: ( + params: { name: string; seriesName: string; value: number }[] + ) => { + if (params[0]) { + const { name, seriesName, value } = params[0]; + return `
${name}
${seriesName} ${value}
`; + } + return ''; + }, + }, + series: [ + { + name: title, + data: yData, + type: 'line', + lineStyle: { + color: { + type: 'linear', + x: 0, // 起点 x 坐标(0: 左侧) + y: 0, // 起点 y 坐标(0: 顶部) + x2: 1, // 终点 x 坐标(1: 右侧) + y2: 1, // 终点 y 坐标(0: 保持顶部,形成水平渐变) + colorStops: [ + { offset: 0, color: '#9E68FC' }, // 起始颜色 + { offset: 1, color: '#3248F2' }, // 结束颜色 + ], + }, + }, + areaStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: 'rgba(158,104,252,0.1)' }, + { offset: 1, color: 'rgba(50,72,242,0)' }, + ], + global: false, + }, + }, + }, + ], + }); + + // 添加 resize 监听器 + const handleResize = () => { + chart.resize(); + }; + + window.addEventListener('resize', handleResize); + + // 清理函数 + return () => { + window.removeEventListener('resize', handleResize); + }; + }, [data, title]); + + return ( + + + {title} + {extra} + + +
+
+ ); +}; + +export default LineCharts; diff --git a/ui/src/pages/dashboard/components/memberInfo.tsx b/ui/src/pages/dashboard/components/memberInfo.tsx new file mode 100644 index 0000000..ddbef47 --- /dev/null +++ b/ui/src/pages/dashboard/components/memberInfo.tsx @@ -0,0 +1,209 @@ +import React, { useEffect, useRef, useState } from 'react'; +import Card from '@/components/card'; +import dayjs from 'dayjs'; +import { + Box, + Stack, + Typography, + Tooltip, + useTheme, + IconButton, + Menu, + MenuItem, +} from '@mui/material'; +import { ActivityCalendar } from 'react-activity-calendar'; +import { DomainUserHeatmap, DomainUserHeatmapResp } from '@/api/types'; +import { DomainUser } from '@/api/types'; +import Avatar from '@/components/avatar'; +import { Icon } from '@c-x/ui'; + +const getRecent1YearData = ( + data: DomainUserHeatmap[] = [], + max_count: number +) => { + const average = max_count / 5; + const today = dayjs(); + const lastYearToday = today.subtract(1, 'year'); + const diffInDays = today.diff(lastYearToday, 'day'); + const result: { count: number; date: string; level: number }[] = []; + const dateMap: Record = {}; + data.forEach((item) => { + dateMap[dayjs.unix(item.date!).format('YYYY-MM-DD')] = item.count!; + }); + + for (let i = 0; i < diffInDays; i++) { + const time = today.subtract(i, 'day').format('YYYY-MM-DD'); + if (dateMap[time]) { + result.unshift({ + count: dateMap[time], + date: time, + level: Math.ceil(dateMap[time] / average) - 1, + }); + } else { + result.unshift({ count: 0, date: time, level: 0 }); + } + } + return result; +}; + +const MemberInfo = ({ + data, + memberData, + userList, + onMemberChange, +}: { + data: DomainUserHeatmapResp; + memberData: DomainUser | null; + userList: DomainUser[]; + onMemberChange: (data: DomainUser) => void; +}) => { + const theme = useTheme(); + const [blockSize, setBlockSize] = useState(9); + const ref = useRef(null); + const [anchorEl, setAnchorEl] = useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + useEffect(() => { + const innerWidth = ref.current?.offsetWidth; + const dis = Math.max(0, Math.ceil((innerWidth! - 1000) / 54)); + setBlockSize(dis + 9); + }, []); + + return ( + + + + + {userList.map((item) => ( + { + onMemberChange(item); + handleClose(); + }} + sx={{ + fontSize: 14, + }} + > + {item.username} + + ))} + + + + + + + + + {memberData?.username} + + + + + {dayjs.unix(memberData?.created_at || 0).fromNow()}加入 + + + + ( + {`${activity.date} ${activity.count} 次使用`} + } + placement='top' + > + {block} + + )} + /> + + + ); +}; + +export default MemberInfo; diff --git a/ui/src/pages/dashboard/components/memberStatistic.tsx b/ui/src/pages/dashboard/components/memberStatistic.tsx new file mode 100644 index 0000000..d831efd --- /dev/null +++ b/ui/src/pages/dashboard/components/memberStatistic.tsx @@ -0,0 +1,192 @@ +import React, { useMemo } from 'react'; +import { Grid2 as Grid } from '@mui/material'; +import { useParams } from 'react-router-dom'; +import MemberInfo from './memberInfo'; +import PieCharts from './pieCharts'; +import LineCharts from './lineCharts'; +import { RecentActivityCard } from './statisticCard'; +import { useRequest } from 'ahooks'; +import { + getUserEventsDashboard, + getUserStatDashboard, + getUserHeatmapDashboard, +} from '@/api/Dashboard'; +import { StyledHighlight } from './globalStatistic'; +import { getRecent90DaysData } from '@/utils'; +import { DomainUser } from '@/api/types'; + +const MemberStatistic = ({ + memberData, + userList, + onMemberChange, +}: { + memberData: DomainUser | null; + userList: DomainUser[]; + onMemberChange: (data: DomainUser) => void; +}) => { + const { id } = useParams(); + const { data: userEvents } = useRequest( + () => + getUserEventsDashboard({ + user_id: id || '', + }), + { + refreshDeps: [id], + manual: false, + ready: !!id, + } + ); + const { data: userStat } = useRequest( + () => + getUserStatDashboard({ + user_id: id || '', + }), + { + refreshDeps: [id], + manual: false, + ready: !!id, + } + ); + const { data: userHeatmap } = useRequest( + () => + getUserHeatmapDashboard({ + user_id: id || '', + }), + { + refreshDeps: [id], + manual: false, + ready: !!id, + } + ); + + const { + chatChartData, + codeCompletionChartData, + codeLineChartData, + acceptedPerChartData, + } = useMemo(() => { + const { + accepted_per = [], + chats = [], + code_completions = [], + lines_of_code = [], + } = userStat || {}; + const chatChartData = getRecent90DaysData(chats, { + valueLabel: 'value', + }); + const codeCompletionChartData = getRecent90DaysData(code_completions, { + valueLabel: 'value', + }); + const codeLineChartData = getRecent90DaysData(lines_of_code, { + valueLabel: 'value', + }); + const acceptedPerChartData = getRecent90DaysData(accepted_per, { + valueLabel: 'value', + }); + return { + chatChartData, + codeCompletionChartData, + codeLineChartData, + acceptedPerChartData, + }; + }, [userStat]); + return ( + + + + + + + + + + + + + + + + + + 最近 90 天共 + {userStat?.total_chats || 0} + 个对话任务 + + } + /> + + + + 最近 90 天共 + + {userStat?.total_completions || 0} + + 个补全任务 + + } + /> + + + + 最近 90 天共修改 + + {userStat?.total_lines_of_code || 0} + + 行代码 + + } + /> + + + + 最近 90 天平均采纳率为 + + {(userStat?.total_accepted_per || 0).toFixed(2)} + + % + + } + /> + + + ); +}; + +export default MemberStatistic; diff --git a/ui/src/pages/dashboard/components/pieCharts.tsx b/ui/src/pages/dashboard/components/pieCharts.tsx new file mode 100644 index 0000000..72b89f0 --- /dev/null +++ b/ui/src/pages/dashboard/components/pieCharts.tsx @@ -0,0 +1,100 @@ +import React, { useRef, useEffect } from 'react'; +import * as echarts from 'echarts'; +import { Box, Stack } from '@mui/material'; + +interface IPieChartsProps { + title: React.ReactNode; + extra?: React.ReactNode; + data: { + category?: string; + value?: number; + }[]; +} + +const PieCharts: React.FC = ({ title, data, extra }) => { + const domRef = useRef(null); + const echartsRef = useRef(null); + + useEffect(() => { + if (!echartsRef.current) { + echartsRef.current = echarts.init(domRef.current); + } + + const chart = echartsRef.current; + chart.setOption({ + tooltip: { + trigger: 'item', + }, + legend: { + orient: 'vertical', + right: '5%', + top: 'center', + }, + dataset: { + source: data, + }, + series: [ + { + type: 'pie', + radius: ['40%', '70%'], + center: ['30%', '50%'], + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 10, + borderColor: '#fff', + borderWidth: 2, + }, + label: { + show: false, + position: 'center', + }, + emphasis: { + label: { + // show: true, + fontSize: 40, + fontWeight: 'bold', + }, + }, + labelLine: { + show: false, + }, + encode: { + value: 'value', + itemName: 'category', + }, + }, + ], + }); + + // 添加 resize 监听器 + const handleResize = () => { + chart.resize(); + }; + + window.addEventListener('resize', handleResize); + + // 清理函数 + return () => { + window.removeEventListener('resize', handleResize); + }; + }, [data]); + + return ( + + + {title} + {extra} + + +
+
+ ); +}; + +export default PieCharts; diff --git a/ui/src/pages/dashboard/components/statisticCard.tsx b/ui/src/pages/dashboard/components/statisticCard.tsx new file mode 100644 index 0000000..488d005 --- /dev/null +++ b/ui/src/pages/dashboard/components/statisticCard.tsx @@ -0,0 +1,182 @@ +import React from 'react'; +import { styled, Stack, Box } from '@mui/material'; +import { Empty } from '@c-x/ui'; +import dayjs from 'dayjs'; +import { useNavigate } from 'react-router-dom'; + +import Card from '@/components/card'; +import { + DomainStatistics, + DomainUserCodeRank, + DomainUserEvent, +} from '@/api/types'; + +const StyledCardLabel = styled('div')(({ theme }) => ({ + fontSize: '14px', + color: theme.palette.text.secondary, +})); + +const StyledCardValue = styled('div')(({ theme }) => ({ + fontSize: 40, + color: theme.palette.text.primary, + fontWeight: 700, +})); + +const StyledItem = styled('div')(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: theme.spacing(2), +})); + +const StyledText = styled('a')(({ theme }) => ({ + fontSize: 14, + color: theme.palette.text.secondary, + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', +})); + +const StyledSerialNumber = styled('span')<{ num: number }>(({ theme, num }) => { + const numToColor = { + 1: '#FE4545', + 2: '#FF6600', + 3: '#FFC600', + }; + const color = numToColor[num as 1] || '#BCBCBC'; + return { + color: color, + fontSize: 14, + fontWeight: 700, + }; +}); + +export const ContributionCard = ({ + data = [], +}: { + data?: DomainUserCodeRank[]; +}) => { + const navigate = useNavigate(); + + return ( + + + 用户贡献榜 + 最近 90 天 + + + + {data.map((item, index) => ( + + + + {index + 1} + + { + // navigate(`/`) + // // window.open(`/discussion/user/${item.id}`); + // }} + > + {/* */} + + {item.username} + + + + {item.lines} + + ))} + + + ); +}; + +export const UserCard = ({ data = {} as DomainStatistics }) => { + return ( + + + {/* */} + + 总用户数 + + + + {data?.total_users || 0} + + + 其中 {data?.disabled_users || 0} 个用户被禁用 + + + ); +}; + +export const RecentActivityCard = ({ + data = [], +}: { + data?: DomainUserEvent[]; +}) => { + return ( + + 近期活动 + + {data.length > 0 ? ( + data.slice(0, 10).map((item, index) => ( + + + {item.name} + + + {dayjs.unix(item.created_at!).fromNow()} + + + )) + ) : ( + + )} + + + ); +}; diff --git a/ui/src/pages/dashboard/index.tsx b/ui/src/pages/dashboard/index.tsx new file mode 100644 index 0000000..89627c9 --- /dev/null +++ b/ui/src/pages/dashboard/index.tsx @@ -0,0 +1,107 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { getListUser } from '@/api/User'; +import { + Stack, + TextField, + MenuItem, + InputAdornment, + IconButton, +} from '@mui/material'; +import dayjs from 'dayjs'; +import { CusTabs } from '@c-x/ui'; +import GlobalStatistic from './components/globalStatistic'; +import CancelRoundedIcon from '@mui/icons-material/CancelRounded'; +import { useRequest } from 'ahooks'; +import MemberStatistic from './components/memberStatistic'; +import { useParams } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; +import { DomainUser } from '@/api/types'; + +const Dashboard = () => { + const navigate = useNavigate(); + const { tab, id } = useParams(); + const [tabValue, setTabValue] = useState(tab || 'global'); + const [memberId, setMemberId] = useState(id || ''); + const [memberData, setMemberData] = useState(null); + + const { data: userData, refresh } = useRequest( + () => + getListUser({ + page: 1, + size: 99999, + }), + { + manual: true, + onSuccess: (res) => { + if (id) { + setMemberId(id); + setMemberData(res.users?.find((item) => item.id === id) || null); + } else { + setMemberData(res.users?.[0] || null); + setMemberId(res.users?.[0]?.id || ''); + navigate(`/dashboard/member/${res.users?.[0]?.id}`); + } + }, + } + ); + const userList = useMemo(() => { + return userData?.users || []; + }, [userData]); + useEffect(() => { + if (tabValue === 'member') { + refresh(); + } + }, [tabValue]); + + const onMemberChange = (data: DomainUser) => { + setMemberId(data.id!); + setMemberData(data); + navigate(`/dashboard/member/${data.id}`); + }; + + const onTabChange = (value: string) => { + setTabValue(value); + navigate(`/dashboard/${value}`); + }; + + return ( + + + + + + {tabValue === 'global' && } + {tabValue === 'member' && ( + + )} + + ); +}; + +export default Dashboard; diff --git a/ui/src/pages/expectation/index.tsx b/ui/src/pages/expectation/index.tsx new file mode 100644 index 0000000..fcab73a --- /dev/null +++ b/ui/src/pages/expectation/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import nodata from '../../assets/images/nodata.png'; + +const Expectation = () => { + return ( +
+ 敬请期待 +

+ 敬请期待 +

+
+ 更多精彩内容即将上线,敬请期待! +
+
+ ); +}; + +export default Expectation; diff --git a/ui/src/pages/invite/index.tsx b/ui/src/pages/invite/index.tsx new file mode 100644 index 0000000..0374d02 --- /dev/null +++ b/ui/src/pages/invite/index.tsx @@ -0,0 +1,231 @@ +import React, { useState } from 'react'; +import { useParams } from 'react-router-dom'; +import { + Box, + Stepper, + Step, + StepLabel, + TextField, + Button, + Stack, + Typography, + Container, + CardContent, +} from '@mui/material'; +import { useRequest } from 'ahooks'; +import { postRegister } from '@/api/User'; + +import Card from '@/components/card'; +import DownloadIcon from '@mui/icons-material/Download'; +import MenuBookIcon from '@mui/icons-material/MenuBook'; +import { Controller, useForm } from 'react-hook-form'; +import { StyledFormLabel } from '@/components/form'; + +const Invite = () => { + const { id } = useParams(); + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + email: '', + password: '', + }, + }); + const { run: register, loading } = useRequest(postRegister, { + manual: true, + }); + const [activeStep, setActiveStep] = useState(0); + + const onNext = () => { + setActiveStep(activeStep + 1); + }; + + const onRegister = handleSubmit((data) => { + register({ ...data, code: id }); + onNext(); + }); + + return ( + + + + + 欢迎加入 + + + 请完成以下步骤开始使用我们的服务 + + + + + 注册账号 + + + 下载客户端 + + + 使用教程 + + + + {activeStep === 0 && ( + + + 邮箱 + ( + + )} + /> + + + 密码 + ( + + )} + /> + + + + + )} + + {activeStep === 1 && ( + + + + + + 下载 MonkeyCode 客户端 + + + 请下载并安装 MonkeyCode 客户端,这是使用我们服务的必要步骤 + + + + + + )} + + {activeStep === 2 && ( + + + + + + 使用教程 + + + 查看详细的使用教程,快速上手 MonkeyCode 客户端 + + + + + + )} + + + + ); +}; + +export default Invite; diff --git a/ui/src/pages/login/index.tsx b/ui/src/pages/login/index.tsx new file mode 100644 index 0000000..48a6dda --- /dev/null +++ b/ui/src/pages/login/index.tsx @@ -0,0 +1,227 @@ +import React, { useState } from 'react'; +import { + Box, + Button, + TextField, + Typography, + Container, + Paper, + Alert, + CircularProgress, + Grid2 as Grid, + Divider, +} from '@mui/material'; +import { postAdminLogin } from '@/api/User'; +import { useForm, Controller } from 'react-hook-form'; +import { useNavigate } from 'react-router-dom'; +import { styled } from '@mui/material/styles'; +import { Lock, Person } from '@mui/icons-material'; +import { getRedirectUrl } from '@/utils'; + +// 样式化组件 +const StyledContainer = styled(Container)(({ theme }) => ({ + minHeight: '100vh', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + maxWidth: '100% !important', + backgroundColor: theme.palette.background.paper, +})); + +const StyledPaper = styled(Paper)(({ theme }) => ({ + padding: theme.spacing(4), + maxWidth: 400, + width: '100%', + borderRadius: 12, + boxShadow: '0px 10px 20px 0px rgba(54,59,76,0.2)', + backgroundColor: theme.palette.background.default, +})); + +const LogoContainer = styled(Box)(({ theme }) => ({ + textAlign: 'center', + marginBottom: theme.spacing(3), +})); + +// 表单数据类型 +interface LoginFormData { + username: string; + password: string; +} + +const LoginPage = () => { + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm(); + + const loginUser = async (data: LoginFormData) => { + return postAdminLogin({ + username: data.username, + password: data.password, + }); + }; + + // 处理登录表单提交 + const onSubmit = async (data: LoginFormData) => { + setLoading(true); + setError(null); + + try { + await loginUser(data); + const redirectUrl = getRedirectUrl(); + window.location.href = redirectUrl.href; + } catch (err) { + setError(err instanceof Error ? err.message : '登录失败,请重试'); + } finally { + setLoading(false); + } + }; + + return ( + + + + + + + + 欢迎登录 + + + 请输入您的账号和密码 + + + + + + + + + ( + + ), + }, + }} + /> + )} + /> + + + + ( + + ), + }, + }} + /> + )} + /> + + + {error && ( + + + {error} + + + )} + + + + + + + + + ); +}; + +export default LoginPage; diff --git a/ui/src/pages/model/components/lineCharts.tsx b/ui/src/pages/model/components/lineCharts.tsx new file mode 100644 index 0000000..2bd4971 --- /dev/null +++ b/ui/src/pages/model/components/lineCharts.tsx @@ -0,0 +1,120 @@ +import React, { useRef, useEffect } from 'react'; +import * as echarts from 'echarts'; +import { Box, Stack } from '@mui/material'; + +interface ILineChartsProps { + data: { + xData: any[]; + yData: any[]; + }; + name: string; +} + +const LineCharts: React.FC = ({ data, name }) => { + const { xData, yData } = data; + const domRef = useRef(null); + const echartsRef = useRef(null); + + useEffect(() => { + if (!echartsRef.current) { + echartsRef.current = echarts.init(domRef.current); + } + + const chart = echartsRef.current; + chart.setOption({ + xAxis: { + type: 'category', + show: false, + data: xData, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + splitLine: { + show: false, + }, + axisLabel: { + show: false, + }, + }, + grid: { + left: 0, + right: 0, + bottom: 10, + top: 10, + }, + yAxis: { + type: 'value', + splitNumber: 4, + axisLine: { + show: false, + }, + axisTick: { + show: false, + }, + axisLabel: { + show: false, + }, + splitLine: { + lineStyle: { + type: 'dashed', + color: '#F2F3F5', + }, + }, + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow', + }, + formatter: ( + params: { name: string; seriesName: string; value: number }[] + ) => { + if (params[0]) { + const { name, seriesName, value } = params[0]; + return `
${name}
${seriesName} ${value}
`; + } + return ''; + }, + }, + series: [ + { + name, + data: yData, + type: 'line', + lineStyle: { + color: { + type: 'linear', + x: 0, // 起点 x 坐标(0: 左侧) + y: 0, // 起点 y 坐标(0: 顶部) + x2: 1, // 终点 x 坐标(1: 右侧) + y2: 1, // 终点 y 坐标(0: 保持顶部,形成水平渐变) + colorStops: [ + { offset: 0, color: '#9E68FC' }, // 起始颜色 + { offset: 1, color: '#3248F2' }, // 结束颜色 + ], + }, + }, + }, + ], + }); + + // 添加 resize 监听器 + const handleResize = () => { + chart.resize(); + }; + + window.addEventListener('resize', handleResize); + + // 清理函数 + return () => { + window.removeEventListener('resize', handleResize); + }; + }, [data, name]); + + return ; +}; + +export default LineCharts; diff --git a/ui/src/pages/model/components/modelCard.tsx b/ui/src/pages/model/components/modelCard.tsx new file mode 100644 index 0000000..5a40370 --- /dev/null +++ b/ui/src/pages/model/components/modelCard.tsx @@ -0,0 +1,241 @@ +import React, { useState } from 'react'; +import Card from '@/components/card'; +import { useRequest } from 'ahooks'; +import { getMyModelList, putUpdateModel } from '@/api/Model'; +import { DomainModel, ConstsModelStatus } from '@/api/types'; +import { Stack, Box, Button, Grid2 as Grid, Chip } from '@mui/material'; +import { Icon, Modal, message } from '@c-x/ui'; +import { addCommasToNumber } from '@/utils'; +import NoData from '@/assets/images/nodata.png'; +import { ModelProvider } from '../constant'; +import ModelModal from './modelModal'; + +const ModelItem = ({ + data, + onEdit, + refresh, +}: { + data: DomainModel; + onEdit: (data: DomainModel) => void; + refresh: () => void; +}) => { + const onInactiveModel = () => { + Modal.confirm({ + title: '停用模型', + content: ( + <> + 确定要停用{' '} + + {data.model_name} + {' '} + 模型吗? + + ), + okText: '停用', + okButtonProps: { + color: 'error', + }, + onOk: () => { + putUpdateModel({ + id: data.id, + status: ConstsModelStatus.ModelStatusInactive, + }).then(() => { + message.success('停用成功'); + refresh(); + }); + }, + }); + }; + + const onActiveModel = () => { + Modal.confirm({ + title: '激活模型', + content: ( + <> + 确定要激活{' '} + + {data.model_name} + {' '} + 模型吗? + + ), + onOk: () => { + putUpdateModel({ + id: data.id, + status: ConstsModelStatus.ModelStatusActive, + }).then(() => { + message.success('激活成功'); + refresh(); + }); + }, + }); + }; + + return ( + + + + + {data.model_name} + + + {data.is_active && ( + + )} + + + + 输入 Token 使用量 + {addCommasToNumber(data.input)} + + + 输出 Token 使用量 + {addCommasToNumber(data.output)} + + + + + + {!data.is_active && ( + + )} + + {data.is_active && ( + + )} + {/* */} + + + + ); +}; + +interface IModelCardProps { + title: string; + modelType: 'llm' | 'coder'; +} + +const ModelCard: React.FC = ({ title, modelType }) => { + const [open, setOpen] = useState(false); + const [editData, setEditData] = useState(null); + + const onEdit = (data: DomainModel) => { + setOpen(true); + setEditData(data); + }; + + const { data: modelList = [], refresh } = useRequest(() => + getMyModelList({ + model_type: modelType, + }) + ); + + return ( + + + {title} + + + {modelList?.length > 0 ? ( + + {modelList.map((item) => ( + + + + ))} + + ) : ( + + empty + + 暂无模型,请先添加模型 + + + )} + + setOpen(false)} + refresh={refresh} + data={editData} + modelType={modelType} + /> + + ); +}; + +export default ModelCard; diff --git a/ui/src/pages/model/components/modelModal.tsx b/ui/src/pages/model/components/modelModal.tsx new file mode 100644 index 0000000..8c55a4c --- /dev/null +++ b/ui/src/pages/model/components/modelModal.tsx @@ -0,0 +1,542 @@ +// import { +// addModel, +// getModelByProviderBrand, +// ModelItem, +// testModel, +// updateModel, +// } from '@/api'; +import { + postCreateModel, + putUpdateModel, + postCheckModel, + getListModel, +} from '@/api/Model'; +import Card from '@/components/card'; +import { ModelProvider } from '../constant'; +import { Icon, message, Modal } from '@c-x/ui'; +import { + Box, + Button, + MenuItem, + Stack, + TextField, + useTheme, + alpha, +} from '@mui/material'; +import { useEffect, useMemo, useState } from 'react'; +import { Controller, useForm } from 'react-hook-form'; +import { + DomainModelBasic, + ConstsModelType, + DomainUpdateModelReq, + DomainCreateModelReq, + DomainProviderModel, +} from '@/api/types'; + +type ModelItem = any; + +interface AddModelProps { + open: boolean; + data?: ModelItem; + onClose: () => void; + refresh: () => void; + modelType: 'llm' | 'coder'; +} + +const ModelModal = ({ + open, + onClose, + refresh, + data, + modelType, +}: AddModelProps) => { + const theme = useTheme(); + const spaceId = 1; + const { + formState: { errors }, + handleSubmit, + control, + reset, + setValue, + watch, + } = useForm>({ + defaultValues: { + provider: data?.provider || 'DeepSeek', + api_base: data?.api_base || ModelProvider.DeepSeek.defaultBaseUrl, + model_name: data?.model_name || '', + // api_version: data?.api_version || '', + api_key: data?.api_key || '', + // api_header_key: data?.api_header?.split('=')[0] || '', + // api_header_value: data?.api_header?.split('=')[1] || '', + }, + }); + + const providerBrand = watch('provider') as keyof typeof ModelProvider; + + const [modelUserList, setModelUserList] = useState([]); + + const [loading, setLoading] = useState(false); + const [modelLoading, setModelLoading] = useState(false); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(false); + + // const getModel = (value: AddModelForm) => { + // let header = ''; + // if (value.api_header_key && value.api_header_value) { + // header = value.api_header_key + '=' + value.api_header_value; + // } + // setModelLoading(true); + // getModelByProviderBrand({ + // space_id: spaceId, + // api_key: value.api_key, + // base_url: value.base_url, + // provider_brand: value.provider_brand, + // api_header: header, + // }) + // .then((res) => { + // setModelUserList(res.models || []); + // if (data && (res.models || []).find((it) => it.model === data.model)) { + // setValue('model', data.model); + // } else { + // setValue('model', res.models?.[0]?.model || ''); + // } + // setSuccess(true); + // }) + // .finally(() => { + // setModelLoading(false); + // }); + // }; + + const onCreateModel = (value: DomainCreateModelReq) => { + return postCreateModel({ + ...value, + model_type: modelType as ConstsModelType, + }).then(() => { + message.success('添加成功'); + reset(); + onClose(); + refresh(); + }); + }; + + const onUpdateModel = (value: DomainUpdateModelReq) => { + return putUpdateModel({ + ...value, + }).then(() => { + message.success('修改成功'); + reset(); + onClose(); + refresh(); + }); + }; + + const onSubmit = (value: Required) => { + const header = ''; + // if (value.api_header_key && value.api_header_value) { + // header = value.api_header_key + '=' + value.api_header_value; + // } + setError(''); + setLoading(true); + postCheckModel({ + ...value, + }) + .then((res) => { + if (data) { + onUpdateModel({ + ...value, + id: data.id, + }).finally(() => { + setLoading(false); + }); + } else { + onCreateModel(value).finally(() => { + setLoading(false); + }); + } + }) + .catch(() => { + setLoading(false); + }); + }; + + useEffect(() => { + if (open) { + if (data) { + if (data.provider_brand && data.provider_brand !== 'Other') { + // getModel({ + // api_key: data.api_key || '', + // base_url: data.base_url || '', + // model: data.model || '', + // provider_brand: data.provider_brand || '', + // api_version: data.api_version || '', + // api_header_key: data.api_header?.split('=')[0] || '', + // api_header_value: data.api_header?.split('=')[1] || '', + // }); + } + reset( + { + provider: data.provider || 'Other', + model_name: data.model_name || '', + api_base: data.api_base || '', + api_key: data.api_key || '', + // api_version: data.api_version || '', + // api_header_key: data.api_header?.split('=')[0] || '', + // api_header_value: data.api_header?.split('=')[1] || '', + }, + { + keepDefaultValues: true, + } + ); + } else { + reset(); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, open]); + + useEffect(() => { + if (open) { + getListModel().then((res) => { + setModelUserList(res.providers || []); + }); + } + }, [open]); + + const currentModelList = useMemo(() => { + return ( + modelUserList.find((it) => it.provider === providerBrand)?.models || [] + ); + }, [modelUserList, providerBrand]); + + useEffect(() => { + if (currentModelList.length > 0) { + setValue('api_base', currentModelList[0].api_base || ''); + setValue('model_name', currentModelList[0].name || ''); + } + }, [currentModelList]); + + return ( + { + reset(); + setModelUserList([]); + setSuccess(false); + setLoading(false); + setError(''); + onClose(); + }} + okText='保存' + onOk={handleSubmit(onSubmit)} + okButtonProps={{ + loading, + }} + > + + + + 模型供应商 + + {modelUserList.map((it) => ( + { + if (data) return; + // setModelUserList([]); + setError(''); + reset( + { + provider: it.provider as keyof typeof ModelProvider, + api_base: '', + model_name: '', + // api_version: '', + api_key: '', + // api_header_key: '', + // api_header_value: '', + }, + { + keepDefaultValues: true, + } + ); + }} + > + + {it.provider} + + ))} + + + + API 地址{' '} + + * + + + ( + { + field.onChange(e.target.value); + setModelUserList([]); + setValue('model_name', ''); + }} + /> + )} + /> + + + API Secret + {ModelProvider[providerBrand].secretRequired && ( + + {' '} + * + + )} + + {ModelProvider[providerBrand].modelDocumentUrl && ( + + window.open( + ModelProvider[providerBrand].modelDocumentUrl, + '_blank' + ) + } + > + 查看文档 + + )} + + ( + { + field.onChange(e.target.value); + }} + /> + )} + /> + {/* {providerBrand === 'AzureOpenAI' && ( + <> + + API Version + + ( + { + field.onChange(e.target.value); + setModelUserList([]); + setValue('model', ''); + setSuccess(false); + }} + /> + )} + /> + + )} */} + {providerBrand === 'Other' ? ( + <> + + 模型名称{' '} + + * + + + ( + + )} + /> + + 需要与模型供应商提供的名称完全一致,不要随便填写 + + + ) : ( + <> + + 模型名称{' '} + + * + + + ( + + {currentModelList.map((it) => ( + + {it.name} + + ))} + + )} + /> + {/* {ModelProvider[providerBrand].customHeader && ( + <> + + Header + + + ( + + )} + /> + = + ( + + )} + /> + + + )} */} + + )} + {error && ( + + {error} + + )} + + + + ); +}; + +export default ModelModal; diff --git a/ui/src/pages/model/components/tokenUsage.tsx b/ui/src/pages/model/components/tokenUsage.tsx new file mode 100644 index 0000000..794c893 --- /dev/null +++ b/ui/src/pages/model/components/tokenUsage.tsx @@ -0,0 +1,108 @@ +import React, { useMemo } from 'react'; +import Card from '@/components/card'; +import { Stack, Box, styled } from '@mui/material'; +import LineCharts from './lineCharts'; +import { useRequest } from 'ahooks'; +import { getGetTokenUsage } from '@/api/Model'; +import { addCommasToNumber, getRecent90DaysData } from '@/utils'; +import { DomainModelTokenUsage } from '@/api/types'; + +export const StyledHighlight = styled('span')(({ theme }) => ({ + fontSize: 18, + color: theme.palette.text.primary, + fontWeight: 700, +})); + +const StyledTokenWrapper = styled(Stack)(({ theme }) => ({ + width: 200, + fontSize: 14, + backgroundColor: theme.vars.palette.grey[50], + borderRadius: '10px', + padding: theme.spacing(1.5, 1), +})); + +const TokenUsage = () => { + const { data: llmModelData } = useRequest(() => + getGetTokenUsage({ + model_type: 'llm', + }) + ); + const { data: coderModelData } = useRequest(() => + getGetTokenUsage({ + model_type: 'coder', + }) + ); + + const { llmInputData, llmOutputData } = useMemo(() => { + return { + llmInputData: getRecent90DaysData( + (llmModelData?.input_usage as Required[]) || [] + ), + llmOutputData: getRecent90DaysData( + (llmModelData?.output_usage as Required[]) || [] + ), + }; + }, [llmModelData]); + + const { coderInputData, coderOutputData } = useMemo(() => { + return { + coderInputData: getRecent90DaysData( + (coderModelData?.input_usage as Required[]) || [] + ), + coderOutputData: getRecent90DaysData( + (coderModelData?.output_usage as Required[]) || + [] + ), + }; + }, [coderModelData]); + + return ( + + + Token 使用量 + 最近 90 天 + + + + + + {addCommasToNumber(llmModelData?.total_input)} + + 对话模型 - 输入 Token + + + + + + + {addCommasToNumber(llmModelData?.total_output)} + + 对话模型 - 输出 Token + + + + + + + {addCommasToNumber(coderModelData?.total_input)} + + 代码补全模型 - 输入 Token + + + + + + + {addCommasToNumber(coderModelData?.total_output)} + + 代码补全模型 - 输出 Token + + + + + + + ); +}; + +export default TokenUsage; diff --git a/ui/src/pages/model/constant.ts b/ui/src/pages/model/constant.ts new file mode 100644 index 0000000..1a5d458 --- /dev/null +++ b/ui/src/pages/model/constant.ts @@ -0,0 +1,83 @@ +export const ModelProvider = { + 百智云: { + label: '百智云', + cn: '', + icon: 'icon-baizhiyunlogo', + urlWrite: false, + secretRequired: true, + customHeader: false, + modelDocumentUrl: 'https://platform.deepseek.com/api_keys', + defaultBaseUrl: 'https://api.deepseek.com/v1', + }, + DeepSeek: { + label: 'DeepSeek', + cn: '', + icon: 'icon-deepseek', + urlWrite: false, + secretRequired: true, + customHeader: false, + modelDocumentUrl: 'https://platform.deepseek.com/api_keys', + defaultBaseUrl: 'https://api.deepseek.com/v1', + }, + OpenAI: { + label: 'OpenAI', + cn: '', + icon: 'icon-chatgpt', + urlWrite: false, + secretRequired: true, + customHeader: false, + modelDocumentUrl: 'https://platform.openai.com/api-keys', + defaultBaseUrl: 'https://api.openai.com/v1', + }, + Ollama: { + label: 'Ollama', + cn: '', + icon: 'icon-ollama', + urlWrite: true, + secretRequired: false, + customHeader: true, + modelDocumentUrl: '', + defaultBaseUrl: 'http://127.0.0.1:11434/v1', + }, + SiliconFlow: { + label: 'SiliconFlow', + cn: '硅基流动', + icon: 'icon-a-ziyuan2', + urlWrite: false, + secretRequired: true, + customHeader: false, + modelDocumentUrl: 'https://cloud.siliconflow.cn/account/ak', + defaultBaseUrl: 'https://api.siliconflow.cn/v1', + }, + Moonshot: { + label: 'Moonshot', + cn: '月之暗面', + icon: 'icon-Kim', + urlWrite: false, + secretRequired: true, + customHeader: false, + modelDocumentUrl: 'https://platform.moonshot.cn/console/api-keys', + defaultBaseUrl: 'https://api.moonshot.cn/v1', + }, + AzureOpenAI: { + label: 'AzureOpenAI', + cn: 'Azure OpenAI', + icon: 'icon-azure', + urlWrite: true, + secretRequired: true, + customHeader: false, + modelDocumentUrl: + 'https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI', + defaultBaseUrl: 'https://.openai.azure.com', + }, + Other: { + label: 'Other', + cn: '其他', + icon: 'icon-a-AIshezhi', + urlWrite: true, + secretRequired: true, + customHeader: false, + modelDocumentUrl: '', + defaultBaseUrl: '', + }, +}; diff --git a/ui/src/pages/model/index.tsx b/ui/src/pages/model/index.tsx new file mode 100644 index 0000000..8f88ad8 --- /dev/null +++ b/ui/src/pages/model/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import TokenUsage from './components/tokenUsage'; +import ModelCard from './components/modelCard'; +import { Stack } from '@mui/material'; + +const Model = () => { + return ( + + + + + + ); +}; + +export default Model; diff --git a/ui/src/pages/user/index.tsx b/ui/src/pages/user/index.tsx new file mode 100644 index 0000000..c770989 --- /dev/null +++ b/ui/src/pages/user/index.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import Card from '@/components/card'; +import { Stack, styled, Switch } from '@mui/material'; +import { useRequest } from 'ahooks'; +import { getGetSetting, putUpdateSetting } from '@/api/User'; +import MemberManage from './memberManage'; +import LoginHistory from './loginHistory'; +import { message } from '@c-x/ui'; + +const StyledCard = styled(Card)({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', +}); + +const StyledLabel = styled('div')(({ theme }) => ({ + fontWeight: 700, + fontSize: 14, + color: theme.vars.palette.text.primary, +})); + +const User = () => { + const { + data = { + enable_sso: false, + force_two_factor_auth: false, + disable_password_login: false, + }, + refresh, + } = useRequest(() => getGetSetting()); + const { run: updateSetting } = useRequest(putUpdateSetting, { + manual: true, + onSuccess: () => { + refresh(); + message.success('设置更新成功'); + }, + }); + return ( + + + 单点登录 + updateSetting({ enable_sso: e.target.checked })} + /> + + + 强制成员启用两步认证 + { + console.log(e.target.checked); + updateSetting({ force_two_factor_auth: e.target.checked }); + }} + /> + + + 禁止成员使用密码登录 + + updateSetting({ disable_password_login: e.target.checked }) + } + /> + + + + + ); +}; + +export default User; diff --git a/ui/src/pages/user/inviteUserModal.tsx b/ui/src/pages/user/inviteUserModal.tsx new file mode 100644 index 0000000..37319c3 --- /dev/null +++ b/ui/src/pages/user/inviteUserModal.tsx @@ -0,0 +1,95 @@ +import React, { useState, useEffect } from 'react'; +import { Modal, message, Loading } from '@c-x/ui'; +import { Box, Typography, IconButton, Paper } from '@mui/material'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import { useRequest } from 'ahooks'; +import { getInvite } from '@/api/User'; + +const InviteUserModal = ({ + open, + onClose, +}: { + open: boolean; + onClose: () => void; +}) => { + const [inviteUrl, setInviteUrl] = useState(''); + const { loading, refresh } = useRequest(getInvite, { + manual: true, + onSuccess: (data) => { + setInviteUrl(location.origin + '/invite/' + data?.code); + }, + }); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(inviteUrl); + message.success('链接已复制到剪贴板'); + } catch (err) { + console.error('复制失败:', err); + } + }; + + useEffect(() => { + if (open) { + refresh(); + } + }, [open]); + + return ( + + + + 复制以下链接发送给新用户,邀请他们加入: + + + + + {inviteUrl}{' '} + + + + + + + + + + + 点击复制按钮即可复制邀请链接 + + + + ); +}; + +export default InviteUserModal; diff --git a/ui/src/pages/user/loginHistory.tsx b/ui/src/pages/user/loginHistory.tsx new file mode 100644 index 0000000..208dc85 --- /dev/null +++ b/ui/src/pages/user/loginHistory.tsx @@ -0,0 +1,78 @@ +import Card from '@/components/card'; +import { Stack, Box } from '@mui/material'; +import { useRequest } from 'ahooks'; +import { getLoginHistory } from '@/api/User'; +import { Table } from '@c-x/ui'; +import dayjs from 'dayjs'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { DomainListLoginHistoryResp } from '@/api/types'; + +type LoginHistory = NonNullable< + DomainListLoginHistoryResp['login_histories'] +>[number]; + +const LoginHistory = () => { + const { data, loading } = useRequest(() => getLoginHistory({})); + const columns: ColumnsType = [ + { + title: '账号', + dataIndex: 'user', + render: (user, record) => { + return record?.user?.username; + }, + }, + { + title: '设备', + dataIndex: 'device', + }, + { + title: '客户端版本', + dataIndex: 'client_version', + }, + { + title: 'IP 地址', + dataIndex: 'ip', + render: (ip, record) => { + let address = ''; + if (record?.ip_info) { + address = `${record?.ip_info?.country}-${record?.ip_info?.city}`; + } + return ( + + {ip} + ({address}) + + ); + }, + }, + { + title: '登录时间', + dataIndex: 'created_at', + render: (text) => { + return dayjs.unix(text).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + ]; + return ( + + + 登录历史 + +
+ + ); +}; + +export default LoginHistory; diff --git a/ui/src/pages/user/memberManage.tsx b/ui/src/pages/user/memberManage.tsx new file mode 100644 index 0000000..8d1e7b7 --- /dev/null +++ b/ui/src/pages/user/memberManage.tsx @@ -0,0 +1,368 @@ +import React, { useEffect, useState } from 'react'; +import Card from '@/components/card'; +import { useNavigate } from 'react-router-dom'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; +import { useRequest } from 'ahooks'; +import { deleteDeleteUser, getListUser, putUpdateUser } from '@/api/User'; +import { + Stack, + Box, + Button, + TextField, + Chip, + Paper, + ButtonBase, + IconButton, + Menu, + MenuItem, +} from '@mui/material'; +import { Table, MenuSelect, Modal, message } from '@c-x/ui'; +import InviteUserModal from './inviteUserModal'; +import { ColumnsType } from '@c-x/ui/dist/Table'; +import { ConstsUserStatus, DomainUser } from '@/api/types'; +import dayjs from 'dayjs'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import ErrorRoundedIcon from '@mui/icons-material/ErrorRounded'; + +const ResetPasswordModal = ({ + open, + onCancel, + user, +}: { + open: boolean; + onCancel: () => void; + user: DomainUser; +}) => { + const [isSuccess, setIsSuccess] = useState(false); + const [password, setPassword] = useState(''); + + const onResetPassword = () => { + putUpdateUser({ + id: user.id!, + password: password, + }).then(() => { + message.success('重置密码成功'); + setIsSuccess(true); + }); + }; + + useEffect(() => { + if (open) { + setIsSuccess(false); + setPassword(Math.random().toString(36).substring(2, 15)); + } + }, [open]); + return ( + + + 提示 + + ) + } + footer={false} + > + {!isSuccess && ( + + + 确认重置密码吗? + + + + + + + )} + {isSuccess && ( + + + 密码重置成功,请将账号和密码复制到剪贴板 + + + + 账号:{user.username} + 密码:{password} + + + { + message.success('复制成功'); + onCancel(); + }} + > + + + + )} + + ); +}; + +const MemberManage = () => { + const navigate = useNavigate(); + const [open, setOpen] = useState(false); + const [resetPasswordOpen, setResetPasswordOpen] = useState(false); + const [currentUser, setCurrentUser] = useState(null); + const { data, loading, refresh } = useRequest(() => getListUser({})); + const [anchorEl, setAnchorEl] = useState(null); + + const handleClick = ( + event: React.MouseEvent, + record: DomainUser + ) => { + setAnchorEl(event.currentTarget); + setCurrentUser(record); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const onDeleteUser = () => { + handleClose(); + Modal.confirm({ + title: '提示', + okText: '删除', + okButtonProps: { + color: 'error', + }, + content: ( + <> + 确定要删除该用户{' '} + + {currentUser!.username} + {' '} + 吗? + + ), + onOk: () => { + deleteDeleteUser({ id: currentUser!.id! }).then(() => { + message.success('删除成功'); + refresh(); + }); + }, + }); + }; + + const onUnLockUser = () => { + handleClose(); + Modal.confirm({ + title: '提示', + okText: '解锁', + content: ( + <> + 确定要解锁该用户{' '} + + {currentUser!.username} + {' '} + 吗? + + ), + onOk: () => { + putUpdateUser({ + id: currentUser!.id!, + status: ConstsUserStatus.UserStatusActive, + }).then(() => { + message.success('解锁成功'); + refresh(); + }); + }, + }); + }; + + const onLockUser = () => { + handleClose(); + Modal.confirm({ + title: '提示', + okText: '锁定', + okButtonProps: { + color: 'error', + }, + content: ( + <> + 确定要锁定该用户{' '} + + {currentUser!.username} + {' '} + 吗? + + ), + onOk: () => { + putUpdateUser({ + id: currentUser!.id!, + status: ConstsUserStatus.UserStatusLocked, + }).then(() => { + message.success('锁定成功'); + refresh(); + }); + }, + }); + }; + + const columns: ColumnsType = [ + { + title: '账号', + dataIndex: 'username', + }, + { + title: '两步认证', + dataIndex: 'two_step_auth', + render: (text) => { + return text ? ( + + ) : ( + + ); + }, + }, + { + title: '最近活跃时间', + dataIndex: 'last_active_at', + render: (text) => { + return dayjs.unix(text).format('YYYY-MM-DD HH:mm:ss'); + }, + }, + { + title: '统计使用情况', + dataIndex: 'status', + render: (_, record) => { + return ( + navigate(`/dashboard/member/${record.id}`)} + sx={{ + color: 'info.main', + }} + > + 点击查看 + + ); + }, + }, + { + title: '', + dataIndex: 'action', + width: 100, + render: (_, record) => { + return ( + handleClick(e, record)} + sx={{ + '&:hover': { + color: 'info.main', + }, + }} + > + + + ); + }, + }, + ]; + console.log(currentUser); + return ( + + + {currentUser?.status === ConstsUserStatus.UserStatusActive && ( + 解锁成员 + )} + {currentUser?.status === ConstsUserStatus.UserStatusLocked && ( + 解锁成员 + )} + { + setCurrentUser(null); + setResetPasswordOpen(true); + }} + > + 重置密码 + + + + 删除成员 + + + + + 成员列表 + + + + + +
+ setOpen(false)} /> + setResetPasswordOpen(false)} + user={currentUser!} + /> + + ); +}; + +export default MemberManage; diff --git a/ui/src/router.tsx b/ui/src/router.tsx new file mode 100644 index 0000000..f5f9fd1 --- /dev/null +++ b/ui/src/router.tsx @@ -0,0 +1,98 @@ +import LinearProgress from '@mui/material/LinearProgress'; +import { styled } from '@mui/material/styles'; +import { createBrowserRouter, Navigate } from 'react-router-dom'; +import MainLayout from './layouts/mainLayout'; +import { type LazyExoticComponent, Suspense, forwardRef, lazy } from 'react'; +import { type JSX } from 'react/jsx-runtime'; + +const LoaderWrapper = styled('div')({ + position: 'fixed', + top: 0, + left: 0, + zIndex: 1301, + width: '100%', +}); + +const Loader = () => ( + + + +); + +const LazyLoadable = ( + Component: LazyExoticComponent<() => JSX.Element> +): React.ForwardRefExoticComponent => + forwardRef((props: any, ref: React.Ref) => ( + }> + + + )); + +const Dashboard = LazyLoadable(lazy(() => import('@/pages/dashboard'))); +const Chat = LazyLoadable(lazy(() => import('@/pages/chat'))); +const Completion = LazyLoadable(lazy(() => import('@/pages/completion'))); +const Model = LazyLoadable(lazy(() => import('@/pages/model'))); +const User = LazyLoadable(lazy(() => import('@/pages/user'))); +const Admin = LazyLoadable(lazy(() => import('@/pages/admin'))); +const Invite = LazyLoadable(lazy(() => import('@/pages/invite'))); +const Auth = LazyLoadable(lazy(() => import('@/pages/auth'))); +const Login = LazyLoadable(lazy(() => import('@/pages/login'))); +const Expectation = LazyLoadable(lazy(() => import('@/pages/expectation'))); + +const routerConfig = [ + { + path: '/', + element: , + redirect: '/dashboard', + children: [ + { + index: true, + element: , + }, + { + path: 'dashboard/:tab?/:id?', + element: , + }, + { + path: 'chat', + element: , + }, + { + path: 'code-security', + element: , + }, + { + path: 'completion', + element: , + }, + { + path: 'model', + element: , + }, + { + path: 'user', + element: , + }, + { + path: 'admin', + element: , + }, + ], + }, + { + path: '/invite/:id', + element: , + }, + { + path: '/auth', + element: , + }, + { + path: '/login', + element: , + }, +]; + +const router = createBrowserRouter(routerConfig, {}); + +export default router; diff --git a/ui/src/theme.ts b/ui/src/theme.ts new file mode 100644 index 0000000..954ec37 --- /dev/null +++ b/ui/src/theme.ts @@ -0,0 +1,193 @@ +'use client'; +import { createTheme } from '@mui/material'; +import type { Shadows } from '@mui/material'; +import { zhCN } from '@mui/material/locale'; +import { zhCN as CuiZhCN } from '@c-x/ui/dist/local'; +import onData from '@/assets/images/nodata.png'; +import { common } from '@mui/material/colors'; + +const defaultTheme = createTheme(); + +const lightTheme = createTheme( + { + cssVariables: true, + palette: { + // mode: 'light', + primary: { + main: '#21222D', + }, + error: { + main: '#F64E54', + }, + success: { + main: '#82DDAF', + light: '#AAF27F', + dark: '#229A16', + contrastText: '#fff', + }, + info: { + main: '#556AFF', + }, + disabled: { + main: '#666', + }, + dark: { + dark: '#000', + main: '#14141B', + light: '#20232A', + contrastText: '#fff', + }, + light: { + main: '#fff', + contrastText: '#000', + }, + background: { + default: '#fff', + paper: '#F1F2F8', + }, + + text: { + primary: '#21222D', + secondary: 'rgba(33,34,45, 0.7)', + tertiary: 'rgba(33,34,45, 0.5)', + disabled: 'rgba(33,34,45, 0.2)', + }, + divider: '#ECEEF1', + }, + shadows: [ + ...defaultTheme.shadows.slice(0, 8), + '0px 10px 20px 0px rgba(54,59,76,0.2)', + ...defaultTheme.shadows.slice(9), + ] as Shadows, + components: { + MuiPaper: { + styleOverrides: { + root: { + backgroundColor: '#fff', + backgroundImage: 'none', + }, + }, + }, + + MuiInputBase: { + styleOverrides: { + root: { + backgroundColor: '#F8F9FA', + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + '.MuiOutlinedInput-notchedOutline': { + borderColor: 'transparent', + }, + '&.Mui-focused .MuiOutlinedInput-notchedOutline': { + borderColor: '#21222D !important', + borderWidth: '1px !important', + }, + borderRadius: '10px !important', + }, + }, + }, + + MuiTypography: { + styleOverrides: { + root: { + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + }, + }, + }, + MuiButtonBase: { + styleOverrides: { + root: { + lineHeight: '1.5', + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + lineHeight: '1.5', + borderRadius: '10px', + boxShadow: 'none', + }, + }, + }, + // @ts-ignore + MuiLoadingButton: { + styleOverrides: { + root: { + lineHeight: '1.5', + borderRadius: '10px', + }, + }, + }, + MuiMenu: { + styleOverrides: { + paper: { + borderRadius: '10px', + }, + }, + }, + MuiMenuItem: { + styleOverrides: { + root: { + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + fontSize: '14px', + }, + }, + }, + MuiFormLabel: { + styleOverrides: { + root: { + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + }, + asterisk: { + color: '#F64E54', + }, + }, + }, + MuiLink: { + styleOverrides: { + root: { + textDecoration: 'none', + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + borderColor: '#eee', + paddingLeft: '24px !important', + fontFamily: 'var(--font-gilory), var(--font-HarmonyOS)', + padding: '25px 12px 26px !important', + }, + head: { + paddingTop: '0 !important', + paddingBottom: '0 !important', + height: '50px', + backgroundColor: '#f8f9fa', + borderBottom: 'none !important', + }, + body: { + borderBottom: '1px dashed', + borderColor: '#ECEEF1', + }, + }, + }, + }, + }, + zhCN, + CuiZhCN, + { + components: { + CuiEmpty: { + defaultProps: { + image: onData, + imageStyle: { + width: '150px', + }, + }, + }, + }, + } +); + +export { lightTheme }; diff --git a/ui/src/utils/index.ts b/ui/src/utils/index.ts new file mode 100644 index 0000000..eca20c4 --- /dev/null +++ b/ui/src/utils/index.ts @@ -0,0 +1,220 @@ +import { Decimal } from 'decimal.js'; +import dayjs from 'dayjs'; + +/** + * 格式化时间 + * @param time 时间戳 + * @returns 格式化后的时间 +/** + * 将token数量转换为人民币金额 + * @param tokenCount token数量 + * @returns 转换后的人民币金额(元),带有金额单位 + */ +export const convertTokensToRMB = ( + tokenCount: number | string, + precision = 6 +): string => { + // 将token数量转为数字类型 + const tokens = Number(tokenCount); + // 检查是否为有效数字 + if (isNaN(tokens)) { + return '0元'; + } + // 1元 = 1M tokens, 所以除以1000000得到元 + const rmb = Decimal(tokens).div(1000000); + // 保留2位小数并添加单位 + return `${rmb.toFixed(precision)}`; +}; + +/** + * 计算本月结束时间 + * @param startTimestamp 开始时间戳 + * @param endTimestamp 结束时间戳 + * @returns 计算后的结束时间戳 + */ +export const calculateMonthEndTime = ( + startTimestamp: number, + endTimestamp: number +): number => { + // 一个月的秒数 (30天) + const ONE_MONTH_SECONDS = 2592000; + + // 如果时间差大于一个月 + if (endTimestamp - startTimestamp > ONE_MONTH_SECONDS) { + return startTimestamp + ONE_MONTH_SECONDS; + } + + return endTimestamp; +}; + +// 按日期聚合数据 +export const aggregatedTime = ( + data: any, + type: 'd' | 's' = 'd', + sort: 'asc' | 'desc' = 'desc' +) => { + function getDateFromTimestamp(timestamp: number) { + return dayjs.unix(timestamp).format('YYYY-MM-DD'); + } + const aggregatedData = data.reduce((acc: any, curr: any) => { + const date = + type === 'd' ? getDateFromTimestamp(curr.created_at) : curr.created_at; + if (!acc[date]) { + acc[date] = { + created_at: curr.created_at, + token_used: 0, + count: 0, + quota: 0, + }; + } + acc[date].token_used += curr.token_used; + acc[date].count += curr.count; + acc[date].quota += curr.quota; + + return acc; + }, {}); + return Object.values(aggregatedData).sort((a: any, b: any) => + sort === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at + ); +}; + +export function addCommasToNumber(num: number = 0) { + return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); +} + +export function processText(inputText: string): string { + function escapeRegExp(str: string): string { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + // 提取并移除所有标签 + const toolResults: Array<{ toolId: string; content: string }> = []; + const toolResultPattern = + /]*>([\s\S]*?)<\/toolresult>/g; + + let modifiedText = inputText.replace(toolResultPattern, (match, toolId) => { + toolResults.push({ toolId, content: match }); + return ''; // 移除原标签 + }); + + // 将toolresult插入对应tool标签 + toolResults.forEach(({ toolId, content }) => { + const escapedId = escapeRegExp(toolId); + + // 处理自闭合标签 + // const selfClosingPattern = new RegExp( + // `]*?)\\s*\\/>`, + // "g" + // ); + // modifiedText = modifiedText.replace(selfClosingPattern, (_, attrs) => { + // return `${content}`; + // }); + + // 处理正常标签 ... + const normalPattern = new RegExp( + `(]*)>)([\\s\\S]*?)(<\\/tool>)`, + 'g' + ); + modifiedText = modifiedText.replace( + normalPattern, + (_, startTag, attrs, innerContent, endTag) => { + return `${startTag}${innerContent}${content}\n\n${endTag}`; + } + ); + }); + + return modifiedText; +} + +export const isValidUrl = (url: string) => { + const regex = /^(https?):\/\/[^\s/$.?#].[^\s]*$/i; + return regex.test(url); +}; + +export const getRedirectUrl = () => { + const searchParams = new URLSearchParams(location.search); + const redirect = searchParams.get('redirect') || '/dashboard'; + let redirectUrl: URL | null = null; + try { + redirectUrl = redirect ? new URL(decodeURIComponent(redirect)) : null; + } catch (e) { + redirectUrl = redirect + ? new URL(location.origin + decodeURIComponent(redirect)) + : null; + } + + redirectUrl = isValidUrl(redirectUrl?.href || '') + ? redirectUrl + : new URL('/dashboard', location.origin); + return redirectUrl as URL; +}; + +export const getRecent90DaysData = ( + data: Record[] = [], + label: { keyLabel?: string; valueLabel?: string } = {} +) => { + const { keyLabel = 'timestamp', valueLabel = 'tokens' } = label; + const xData: string[] = []; + const yData: number[] = []; + const dateMap: Record = {}; + data.forEach((item) => { + // 保留原始时间戳和tokens + dateMap[dayjs.unix(item[keyLabel]!).format('YYYY-MM-DD')] = + item[valueLabel]!; + }); + + for (let i = 0; i < 90; i++) { + const time = dayjs().startOf('day').subtract(i, 'day').format('YYYY-MM-DD'); + if (dateMap[time]) { + xData.unshift(time); + yData.unshift(dateMap[time]); + } else { + xData.unshift(time); + yData.unshift(0); + } + } + return { xData, yData }; +}; + +export const getRecent60MinutesData = ( + data: Record[] = [], + label: { keyLabel?: string; valueLabel?: string } = {} +) => { + const { keyLabel = 'timestamp', valueLabel = 'tokens' } = label; + const xData: string[] = []; + const yData: number[] = []; + const dateMap: Record = {}; + data.forEach((item) => { + // 保留原始时间戳和tokens + dateMap[dayjs.unix(item[keyLabel]!).format('YYYY-MM-DD HH:mm')] = + item[valueLabel]!; + }); + + for (let i = 0; i < 60; i++) { + const time = dayjs().subtract(i, 'minute').format('YYYY-MM-DD HH:mm'); + if (dateMap[time]) { + xData.unshift(time); + yData.unshift(dateMap[time]); + } else { + xData.unshift(time); + yData.unshift(0); + } + } + return { xData, yData }; +}; + +export const formatNumber = (num: number) => { + if (num >= 1e11) { + // 100B (100,000,000,000) + return (num / 1e9).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',') + 'B'; // 直接取整,避免小数 + } else if (num >= 1e8) { + // 100M (100,000,000) + return (num / 1e6).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',') + 'M'; + } else if (num >= 1e5) { + // 100K (100,000) + return (num / 1e3).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',') + 'K'; + } else { + // 添加千位逗号分隔符(如 99999 → 99,999) + return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); + } +}; diff --git a/ui/src/utils/vscode.ts b/ui/src/utils/vscode.ts new file mode 100644 index 0000000..e33a47b --- /dev/null +++ b/ui/src/utils/vscode.ts @@ -0,0 +1,225 @@ +// VSCode 授权和深度链接工具函数 + +export interface VSCodeAuthToken { + token: string; + userId: string; + permissions: string[]; + expiresAt: number; + createdAt: number; +} + +export interface VSCodeConfig { + extensionId?: string; + redirectUri?: string; + scope?: string[]; +} + +/** + * 生成 VSCode 授权令牌 + */ +export const generateVSCodeAuthToken = ( + userId: string, + permissions: string[] = ['read', 'write'] +): VSCodeAuthToken => { + const now = Date.now(); + const token = btoa( + JSON.stringify({ + userId, + permissions, + timestamp: now, + random: Math.random().toString(36).substring(7), + }) + ); + + return { + token, + userId, + permissions, + expiresAt: now + 24 * 60 * 60 * 1000, // 24小时后过期 + createdAt: now, + }; +}; + +/** + * 验证授权令牌是否有效 + */ +export const validateAuthToken = (authToken: VSCodeAuthToken): boolean => { + const now = Date.now(); + return authToken.expiresAt > now; +}; + +/** + * 打开 VSCode 并传递授权信息 + */ +export const openVSCodeWithAuth = ( + authToken: VSCodeAuthToken, + config: VSCodeConfig = {} +): void => { + const { + extensionId = 'monkey-code-extension', + redirectUri = 'vscode://monkey-code.auth', + scope = authToken.permissions, + } = config; + + // 构建 VSCode URI scheme + const params = new URLSearchParams({ + token: authToken.token, + userId: authToken.userId, + permissions: scope.join(','), + expires: authToken.expiresAt.toString(), + source: 'web-auth', + }); + + const vscodeUri = `${redirectUri}?${params.toString()}`; + + try { + // 尝试打开 VSCode + window.location.href = vscodeUri; + + // 记录授权日志 + console.log('VSCode 授权信息已发送:', { + uri: vscodeUri, + token: authToken.token, + permissions: authToken.permissions, + }); + } catch (error) { + console.error('打开 VSCode 失败:', error); + throw new Error('无法打开 VSCode,请确保已安装 VSCode'); + } +}; + +/** + * 检查是否安装了 VSCode + */ +export const checkVSCodeInstalled = (): Promise => { + return new Promise((resolve) => { + // 创建一个临时链接来测试 VSCode 是否可用 + const testUri = 'vscode://'; + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = testUri; + + let resolved = false; + + // 设置超时 + const timeout = setTimeout(() => { + if (!resolved) { + resolved = true; + document.body.removeChild(iframe); + resolve(false); + } + }, 2000); + + // 如果成功加载,说明 VSCode 已安装 + iframe.onload = () => { + if (!resolved) { + resolved = true; + clearTimeout(timeout); + document.body.removeChild(iframe); + resolve(true); + } + }; + + document.body.appendChild(iframe); + }); +}; + +/** + * 获取 VSCode 下载链接 + */ +export const getVSCodeDownloadUrl = (): string => { + const platform = navigator.platform.toLowerCase(); + + if (platform.includes('mac')) { + return 'https://code.visualstudio.com/download#mac'; + } else if (platform.includes('win')) { + return 'https://code.visualstudio.com/download#windows'; + } else { + return 'https://code.visualstudio.com/download#linux'; + } +}; + +/** + * 存储授权信息到本地存储 + */ +export const storeAuthToken = (authToken: VSCodeAuthToken): void => { + try { + localStorage.setItem('vscode_auth_token', JSON.stringify(authToken)); + localStorage.setItem('vscode_auth_expires', authToken.expiresAt.toString()); + } catch (error) { + console.error('存储授权令牌失败:', error); + } +}; + +/** + * 从本地存储获取授权信息 + */ +export const getStoredAuthToken = (): VSCodeAuthToken | null => { + try { + const stored = localStorage.getItem('vscode_auth_token'); + if (!stored) return null; + + const authToken = JSON.parse(stored) as VSCodeAuthToken; + + // 检查是否过期 + if (!validateAuthToken(authToken)) { + clearStoredAuthToken(); + return null; + } + + return authToken; + } catch (error) { + console.error('获取存储的授权令牌失败:', error); + return null; + } +}; + +/** + * 清除存储的授权信息 + */ +export const clearStoredAuthToken = (): void => { + try { + localStorage.removeItem('vscode_auth_token'); + localStorage.removeItem('vscode_auth_expires'); + } catch (error) { + console.error('清除授权令牌失败:', error); + } +}; + +/** + * 创建授权成功的回调处理 + */ +export const createAuthCallback = ( + onSuccess?: (token: VSCodeAuthToken) => void, + onError?: (error: Error) => void +) => { + return { + success: (authToken: VSCodeAuthToken) => { + storeAuthToken(authToken); + onSuccess?.(authToken); + }, + error: (error: Error) => { + console.error('VSCode 授权失败:', error); + onError?.(error); + }, + }; +}; + +/** + * 生成插件配置信息 + */ +export const generatePluginConfig = (authToken: VSCodeAuthToken) => { + return { + apiEndpoint: window.location.origin + '/api', + authToken: authToken.token, + userId: authToken.userId, + permissions: authToken.permissions, + version: '1.0.0', + supportedFeatures: [ + 'code-completion', + 'error-detection', + 'refactoring', + 'documentation', + ], + }; +}; diff --git a/ui/src/vite-env.d.ts b/ui/src/vite-env.d.ts new file mode 100644 index 0000000..e1c9006 --- /dev/null +++ b/ui/src/vite-env.d.ts @@ -0,0 +1,30 @@ +/// + +import type { PaletteColorChannel } from '@mui/material'; +declare module '@mui/material/styles' { + interface TypeText { + tertiary: string; + } + + interface Palette { + light: Palette['primary'] & PaletteColorChannel; + dark: Palette['primary'] & PaletteColorChannel; + disabled: Palette['primary'] & PaletteColorChannel; + } + + // allow configuration using `createTheme` + interface PaletteOptions { + light?: PaletteOptions['primary'] & Partial; + dark?: PaletteOptions['primary'] & Partial; + disabled?: PaletteOptions['primary'] & Partial; + text?: Partial; + } +} +declare module '@mui/material/Button' { + interface ButtonPropsColorOverrides { + light: true; + dark: true; + } +} + +import type {} from '@mui/material/themeCssVarsAugmentation'; diff --git a/ui/tsconfig.app.json b/ui/tsconfig.app.json new file mode 100644 index 0000000..33ba764 --- /dev/null +++ b/ui/tsconfig.app.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + }, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + // "erasableSyntaxOnly": false, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json new file mode 100644 index 0000000..fe59a97 --- /dev/null +++ b/ui/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": false, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000..4a3ca23 --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + }, + }, + server: { + proxy: { + '^/api/': process.env.VITE_API_BASE_URL || 'http://localhost:8080/', + }, + host: '0.0.0.0', + port: 3300, + }, +});